Mysql 从具有值1但不具有值2的表中检索项

Mysql 从具有值1但不具有值2的表中检索项,mysql,sql,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=no中未传递的所有名称 `从t1中选择distinctname,其中Pass='No'和Pass'Yes' 不起作用我会使用聚合。假设pass仅接受这两个值: select na

我有一个表t1下面是一个非常简化的版本,真正的表

Name Subject Pass
A    Math    Yes
A    English  No
A    Science  No
B    Math     No
B    English  No
B    Science  No
我需要查询在任何主题pass=no中未传递的所有名称

`从t1中选择distinctname,其中Pass='No'和Pass'Yes'
不起作用

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

select name
from t1
group by name
having min(pass) = 'No' and max(pass) = 'No';
这将检查给定名称的唯一传递值是否为“否”-最小值和最大值相同

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

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

这对t1name、pass上的索引最有效。

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

select name
from t1
group by name
having min(pass) = 'No' and max(pass) = 'No';
这将检查给定名称的唯一传递值是否为“否”-最小值和最大值相同

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

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

这在t1name,pass上的索引最有效。

你的标题和描述不太匹配-但我想你是在追求像这样的老方法

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

你的头衔和描述不太相符,但我想你是在追求像这样的老办法

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

你能解释一下吗?你不是想引入HAVING子句而不是使用where minpass=。。。和maxpass=…?@stickybit。有时候,我想知道自己在想什么。谢谢,都修好了。你能解释一下吗?你不是想引入HAVING子句而不是使用where minpass=。。。和maxpass=…?@stickybit。有时候,我想知道自己在想什么。谢谢,都修好了。