2014-05-06 76 views
1

我一直在試圖弄清楚這一點,但是我沒有成功,偏偏因爲我沒有處理過那麼多的SQL。但是,我開始在一些寵物項目工作,所以我需要從別人的關係思維:)查找所有在給定集合中包含ID的聚合表條目

Supose方式更experianced幫助下,我們有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給定的數組的數組。

在這個例子中,這將是Marry和Apu,因爲John也在project3上工作,並且它沒有給出id。

我想它與this question類似,但由於某種原因,我無法使其工作。

+0

你希望在不返回工項目? –

+0

不,我想我不知道。 – marecar

回答

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 
+0

太棒了!這似乎工作,我會再測試一下,只是爲了確定。 – marecar

1

我想你可以用做到這一點的反連接:

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 
+0

謝謝大家,這個片段似乎也是訣竅。該死的,我應該更熟悉SQL ... – marecar

相關問題