有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
我想选择所有没有标志 = 1 的组
预期成果:
name
B
C
这是行不通的,因为(正确(包括列表一中的所有组
SELECT name
FROM test
WHERE flag <> '1'
GROUP BY name
聚合是执行此操作的一种方法,但您需要一个HAVING
子句来断言匹配组没有标志 = 1:
SELECT name
FROM test
GROUP BY name
HAVING SUM(flag = 1) = 0;
演示
您还可以使用具有存在逻辑的子查询:
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 DISTINCT
:
SELECT DISTINCT `name`
FROM `test`
WHERE `name` NOT IN (SELECT DISTINCT `name` FROM `test` WHERE `flag` = 1);