通过排除带标志的组(MySQL)选择带组的行
此表包含3列:通过排除带标志的组(MySQL)选择带组的行,mysql,group-by,Mysql,Group By,此表包含3列: id name flag 1 A 1 2 A 0 3 A 0 4 B 0 5 B 0 6 C 0 7 D 1 我想选择所有没有flag=1的组 预期成果: name B C 这不起作用,因为正确地包括在列表1中包含的所有组 SELECT name FROM test WHERE flag <
id name flag
1 A 1
2 A 0
3 A 0
4 B 0
5 B 0
6 C 0
7 D 1
我想选择所有没有flag=1的组
预期成果:
name
B
C
这不起作用,因为正确地包括在列表1中包含的所有组
SELECT name
FROM test
WHERE flag <> '1'
GROUP BY name
聚合是实现这一点的一种方法,但您需要一个HAVING子句来断言匹配的组没有flag=1:
SELECT name
FROM test
GROUP BY name
HAVING SUM(flag = 1) = 0;
您还可以使用具有exists逻辑的子查询:
SELECT t1.name
FROM test t1
WHERE NOT EXISTS (SELECT 1 FROM test t2 WHERE t2.name = t1.name AND t2.flag = 1);
聚合是实现这一点的一种方法,但您需要一个HAVING子句来断言匹配的组没有flag=1:
SELECT name
FROM test
GROUP BY name
HAVING SUM(flag = 1) = 0;
您还可以使用具有exists逻辑的子查询:
SELECT t1.name
FROM test t1
WHERE NOT EXISTS (SELECT 1 FROM test t2 WHERE t2.name = t1.name AND t2.flag = 1);
您可以使用下面的查询来获得所需的输出
SELECT `name`
FROM `test`
WHERE `name` <> ALL ( SELECT `name` FROM `test` WHERE `flag` = 1 )
GROUP BY `name`;
您可以使用下面的查询来获得所需的输出
SELECT `name`
FROM `test`
WHERE `name` <> ALL ( SELECT `name` FROM `test` WHERE `flag` = 1 )
GROUP BY `name`;
只需使用SELECT DISTINCT:
只需使用SELECT DISTINCT:
为什么不让SUMflag=0?为什么不呢?事实上,这也会起作用,但这是巧合,而且大多数时候,它不会起作用,因此我不认为这样写。好的,谢谢,只是为了更好地理解它是如何起作用的为什么不让SUMflag=0呢?为什么不呢,这也会起作用,但这是巧合,而且大多数时候,好的,谢谢,只是为了更好地理解它是如何工作的。这个查询返回重复的名称字段这个查询返回重复的名称字段