查找包含给定集合中的ID的所有聚合表条目

时间:2014-05-06 16:51:02

标签: mysql sql database relational-database

我一直试图解决这个问题一段时间了,但我没有成功,因为我没有那么多地处理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类似,但由于某种原因我无法让它工作。

2 个答案:

答案 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