如何测试另一个表中是否存在所有值?

时间:2016-12-09 07:51:32

标签: mysql

我有客户表,项目表和问题表。

clients
cid  cname
-----------
 c1   ca  
 c2   cb
 c3   cc

projects
pid  pname  cid
----------------
 p1   pa     c1
 p2   pb     c1
 p3   pc     c1
 p4   pd     c2
 p5   pe     c2

issues 
iid  iname  pid
----------------
i1     ia   p1
i2     ib   p2
i3     ic   p4
i4     id   p5

我希望客户的项目都存在问题。这是c2 如何为此编写MYSQL查询?

2 个答案:

答案 0 :(得分:2)

以下查询应该为您提供包含问题表中列出的所有项目的客户端ID列表:

SELECT p.cid
FROM projects AS p LEFT JOIN issues AS i ON p.pid=i.pid
GROUP BY p.cid
HAVING COUNT(*)=SUM(CASE WHEN i.iid is NULL THEN 0 ELSE 1 END);

我使用LEFT JOIN,以便获得projects的所有行,如果pidissues不存在问题的值(例如{{}} 1}})将是i.iid

注意:我使用了前进的SQL小提示符进行了更新。

答案 1 :(得分:2)

尝试使用having子句:

select
    c.cid,
    c.cname
from clients c
left join projects p
on c.cid = p.cid
left join issues i
on p.pid = i.pid
group by c.cid, c.cname
having count(distinct p.pid) = count(distinct i.pid) and count(distinct p.pid) > 0

在这里查看SQLFiddle演示。