正如其他人所说,你应该聚合数据,但这里存在许多潜在问题。但在此之前,你已经说明了你想要输出原始记录而不是汇总数据,最简单的解决方案是使用两个查询——一个用于识别仅具有status=0的foreign_ids,另一个用于获取相应的行。
SELECT r.*
FROM examples r
JOIN ( SELECT s.foreign_id, MAX(s.status)
FROM examples s
GROUP BY s.foreign_id
HAVING MAX(s.status)=0
) t
ON r.foreign_id=t.foreign_id
或者,您可以获取 status!=0 的 foreign_ids 并在第二个查询中排除这些foreign_ids——这取决于数据分布,可能更有效。
当“status”<0时,情况就会变得混乱。输出将包括这些行(SUM()也可能发生相同的情况)。有几种方法可以解决这个问题,例如,您可以使用 SUM(ABS(status)) 或 SUM(IF(status=0,0,1))。正如Madhur建议的那样,您还可以使用 GROUP_CONCAT(status) 并检查列的输出是否仅为“0”。
但我怀疑您即将告诉我,由于它是
名义数字,因此状态不能为负数(或null?)。如果是这种情况,则您正在使用错误的数据类型——应该使用 ENUM。如果是这种情况,则无法对 ENUM 应用 SUM() 或 MAX(),但仍然可以使用 SUM(IF(status=?,0,1)) 或 GROUP_CONCAT() 方法。
因此...
SELECT r.*
FROM examples r
JOIN ( SELECT s.foreign_id, SUM(IF(status=0,0,1))
FROM examples s
GROUP BY s.foreign_id
HAVING SUM(IF(status=0,0,1))=0
) t
ON r.foreign_id=t.foreign_id
GROUP BY foreign_id
,查询将无法返回相关数据,然后您会失去id - 因此,您的查询不会过滤正确的foreign_id记录并且不会输出所需的属性。 - symcbeanGROUP BY
子句,请进一步澄清。 - Madhur Bhaiya