Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过排除带标志的组(MySQL)选择带组的行_Mysql_Group By - Fatal编程技术网

通过排除带标志的组(MySQL)选择带组的行

通过排除带标志的组(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 <

此表包含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 <> '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呢?为什么不呢,这也会起作用,但这是巧合,而且大多数时候,好的,谢谢,只是为了更好地理解它是如何工作的。这个查询返回重复的名称字段这个查询返回重复的名称字段