MySQL-选择列值仅为0的行,是否按另一列分组?

MySQL-选择列值仅为0的行,是否按另一列分组?,mysql,sql,database,select,Mysql,Sql,Database,Select,示例表: ID, foreign_id, status ID是唯一的,而外部ID不是唯一的。示例行: 1, 1111, 0 2, 2222, 0 3, 3333, 1 4, 1111, 1 5, 4444, 0 我要选择的是唯一的外部id,其状态仅为0。如果它的状态为0,但具有相同外部ID的另一行的状态为1,则不要选择该外部ID。预期输出: 1, 2222, 0 5, 4444, 0 我可以选择其中的status=0和groupbyforeign\u id,但这只会选择status

示例表:

ID, foreign_id, status
ID是唯一的,而外部ID不是唯一的。示例行:

1, 1111, 0  
2, 2222, 0  
3, 3333, 1
4, 1111, 1
5, 4444, 0
我要选择的是唯一的外部id,其状态仅为0。如果它的状态为0,但具有相同外部ID的另一行的状态为1,则不要选择该外部ID。预期输出:

1, 2222, 0
5, 4444, 0
我可以选择其中的status=0和groupbyforeign\u id,但这只会选择status为0的行,即使可能还有另一行具有与1相同的foreign\u id和status

SELECT ID, foreign_id 
FROM table 
WHERE status = 0 
GROUP BY foreign_id
感谢您的帮助。

使用and DISTINCT子句,我们将所有唯一状态与外部id进行分组。现在在HAVING子句中,我们只需要筛选出那些外部id,其中唯一状态仅为“0”

请尝试以下操作:

SELECT ID, foreign_id, status, GROUP_CONCAT(DISTINCT status) as statuses 
FROM table 
GROUP BY foreign_id 
HAVING statuses = '0'
您可以使用group by并具有:

基本上,你需要在分组后进行测试

如果需要完整的行,请使用“不存在”:

使用聚合函数

select * from t where foreign_id in (
     select foreign_id
        from t
        group by foreign_id
        having min(status) = 0
       ) and status!=1

我编辑了这篇文章,以证明它是有效的,并澄清了一些问题:

你可能感兴趣的是有陈述

您可以在分组结束后使用HAVING语句。这里有一个很好的解释:

简言之,HAVING语句的作用是让您过滤作为GROUP BY表达式结果返回的数据

试试这个:

SELECT 
     foreign_id, MAX(status) AS status
FROM
     myTable
GROUP BY 
     foreign_id
HAVING 
     MAX(status) = 0

以下是在基本MS Access文件中测试的it工作示例:

然后我输入了这个代码:

我得到了这些结果:


如果你有任何问题,请告诉我

正如其他人所说,您应该聚合数据,但这有很多潜在问题。但在我们开始之前,您已经声明希望输出中包含原始记录,而不是合并数据。最简单的解决方案是使用两个查询—一个用于标识状态为0的外来ID,另一个用于获取相应的行

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
或者,您可以在何处获取外国身份=0并排除第二个查询中的查询-这可能更有效,具体取决于数据的分布

在状态<0的情况下,会出现这种情况。输出将包含这些行,可能与SUM相同。有几种方法可以解决这个问题,例如,您可以使用SUMABSTATUS或SUMIFstatus=0,0,1。正如Madhur所建议的,您还可以将_CONCATstatus分组,并检查列的输出是否仅为“0”

但我怀疑你会告诉我状态不能为负或空?因为这是一个很好的例子。如果是这种情况,那么您使用了错误的数据类型-您应该使用枚举。如果是这种情况,则不能对枚举应用SUM或MAX,但仍可以使用SUMIFstatus=?、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_CONCAT是一个不错的主意-但是如果没有GROUP BY EXFINAL_id,查询将不会返回相关数据,然后您将丢失id-因此您的查询不会过滤正确的EXFINAL_id记录,也不会输出所需的数据attributes@symcbean我的查询中有一个GROUPBY子句。请进一步澄清。尝试运行它-查看ID发生了什么-如果DBMS配置为使用严格的语法,您将得到一个错误,或者它将报告它看到的“ID”的最后一个值-所有ID。
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
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