非单调SQL查询(查找只喜欢某些内容的名称)

时间:2016-09-24 20:19:59

标签: mysql sql

我正在尝试学习SQL。我有一个表(称为likes),如下所示:

|---------|---------------|
| name    | color         |
|---------|---------------|
| Jane    | Red           |
| Talia   | Red           |
| Jane    | Black         |
| Loui    | Black         |
| John    | Black         |
| Jane    | Green         |
| John    | Green         |
|---------|---------------|

查询为Names who like only Black。我这样试过:

SELECT L1.name FROM likes L1 WHERE L1.color = 'Black' 
AND NOT EXISTS (SELECT L2.name FROM likes L2 WHERE L1.name = L2.name);

这将返回空,因为Loui子查询中Loui最终将等于NOT EXISTS。但是,我不知道要将其更改为什么,因此它只返回Loui

我可以使用UNION以及上面查询中看到的所有内容,但没有别的。

任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:2)

我会使用group byhaving执行此操作:

select name
from likes
group by name
having max(color) = min(color) and max(color) = 'Black';

您也可以使用您的方法。您需要子查询中的颜色:

SELECT L1.name
FROM likes L1
WHERE L1.color = 'Black' AND
      NOT EXISTS (SELECT L2.name
                  FROM likes L2
                  WHERE L1.name = L2.name AND
                        L2.color <> 'Black'
                 );

答案 1 :(得分:1)

您可以进行反加入。

SELECT L1.name
FROM likes L1
LEFT JOIN likes L2 ON (L1.name = L1.name AND L1.color != L2.color)
WHERE L2.name IS NULL
AND L1.color = 'Black'

这可以通过返回具有不同颜色的相同名称的行来实现。如果没有其他颜色,您将获得NULL,满足条件。

答案 2 :(得分:1)

如果您想要的是找到只喜欢某种特定颜色的人,那么您可以使用分组来做这样的事情:

localhost

您将获得人物颜色关联的分组结果集。然后你过滤那个集合,只返回只有一个你所选颜色的关联的人。

答案 3 :(得分:1)

您可以使用返回只有一种颜色的名称的子选择,然后按颜色黑色过滤

select name fro likes
where name in      ( select name
      FROM likes 
      Group by name
      HAVING count(*) = 1 )
and color = 'Black' ;