从具有value1但不具有value2的表中检索项目

时间:2018-07-09 12:14:53

标签: mysql sql

我有一张桌子t1(下面是真实桌子的非常简化的版本)

Name Subject Pass
A    Math    Yes
A    English  No
A    Science  No
B    Math     No
B    English  No
B    Science  No

我需要查询未通过任何主题的所有名称(pass =否)

从t1中选择与众不同的(名称),其中Pass ='否'并且Pass <>'是' 不起作用

3 个答案:

答案 0 :(得分:3)

Select distinct(name) from t1 where Pass = 'No' and Pass <> 'Yes'

这是行不通的,因为WHERE子句中的表达式一次只对一行进行求值,而不对整个组求值。您的Pass列在任何给定行上不能同时具有'No'和'Yes'值,因此,上面的查询将仅过滤Pass ='No'的行,而不管是否还有其他行是的。

对于查询的解决方案,您可以这样编写:

SELECT name
FROM t1
GROUP BY name
HAVING SUM(Pass = 'Yes') = 0

答案 1 :(得分:0)

我会使用聚合。假设pass仅采用这两个值:

select name
from t1
group by name
having min(pass) = 'No' and max(pass) = 'No';

这将检查给定名称的唯一pass值是否为'No'-最小值和最大值相同。

如果您有单独的名称表,则可能是更有效的版本:

select n.name
from names n
where not exists (select 1 from t1 where t1.name = n.name and t1.pass = 'Yes');

这最适合t1(name, pass)上的索引。

答案 2 :(得分:0)

您的标题和描述不完全匹配-但我认为您是在追求类似的东西(以前的做法)...

SELECT DISTINCT x.name  
           FROM my_table x  
           LEFT 
           JOIN my_table y 
             ON y.name = x.name 
            AND y.pass = 1 -- or 'yes', if you insist
          WHERE y.name IS NULL