我一直试图解决这个问题一段时间了,但我没有成功,因为我没有那么多地处理SQL。但是我开始研究一些宠物项目,所以我需要一些在关系思维方面更有经验的人的帮助:)
我们有3张桌子:
worker(id,...)
worker_project(worker_id,project_id,...)
project(id,...)
而worker_id和project_id是worker_project表的复合主键的一部分。因此,任何工人都可以参与一些项目,任何项目都会有一些工人与自己联系在一起。所以,例如:
John Doe -> project1,project2,project3,project4
Marry jane -> project2,project4
Apu Humuhumunukunukuapua -> project1,project4,project5
给定一系列项目
(e.g. id's of project1,project2,project4,project5)
我想要完成的是找到所有相关项目完全相同的工人 包含在项目ID的GIVEN ARRAY中。
在这个例子中,那将是Marry和Apu,因为John也在project3上工作,并且没有给出它的id。
我想它与this question类似,但由于某种原因我无法让它工作。
答案 0 :(得分:2)
如果我没有误解你的问题,这应该有效:
select w.*
from worker w, (
select worker_id, count(*) cnt
from worker_project
where project_id in (1,4,5)
group by worker_id
) w_count, (
select worker_id, count(*) cnt_all
from worker_project
group by worker_id
) w_count_all
where w.worker_id=w_count.worker_id and
w.worker_id=w_count_all.worker_id and
w_count.cnt=w_count_all.cnt_all
答案 1 :(得分:1)
我认为你可以用反JOIN来实现这个目标:
SELECT w.id
FROM worker w
/* See if they have a project outside our list */
LEFT JOIN worker_project wp
ON wp.worker_id = w.id AND wp.project_id NOT IN (1, 2, 4, 5)
/* Make sure they have a project */
JOIN worker_project wp2
ON wp2.worker_id = w.id
/* Only include those without a project outside the list */
WHERE wp.worker_id IS NULL
GROUP BY w.id