2014-01-24 38 views
2

所以我有一個公司的表格,我有一張能力表和一個加入表格; companies_competenciesSQL語句讓所有公司擁有所有能力列表

我試圖讓所有的公司,他們被鏈接到某個數據集中的所有能力。

因此,例如,我需要得到具有競爭力1,2和3

我已經開始與該查詢所有企業:

SELECT companies.id, companies.name FROM companies, companies_competencies 
WHERE companies.id = companies_competencies.companies_id 
AND companies_competencies.competency_id IN(1,2,3) 
GROUP BY companies.id 

這讓我有1所有公司或許多競爭力,但我試圖讓那些專門擁有它們的公司。

回答

5

這將讓你擁有所有必要的能力的公司ID列表:

select companies_id 
from companies_competencies 
where competency_id in (1, 2, 3) 
group by companies_id 
having count(distinct competency_id) = 3 --the # of unique competency IDs 

那麼你可以這樣做:

select * 
from companies 
where id in (
    select companies_id 
    from companies_competencies 
    where competency_id in (1, 2, 3) 
    group by companies_id 
    having count(distinct competency_id) = 3 
) 
+0

+1:現在這是一個有趣的方法。 –

+4

這裏有12個更多的方法來做到這一點:[如何過濾SQL結果中的多對一關係](http://stackoverflow.com/questions/7364969/how-to-filter-sql-results-in -a-has-many-through-relation) –

+0

謝謝!這是我不知道的'有數'。好東西 –

2

這些公司是否只有其中一種能力?意思是說,某個公司只有一個能力ID 1的實例,等等?

如果是這樣,因爲你已經分組,你可以修改你的聲明,如下所示:

SELECT companies.id, companies.name FROM companies, companies_competencies 
WHERE companies.id = companies_competencies.companies_id 
AND companies_competencies.competency_id IN(1,2,3) 
HAVING COUNT(*) = 3 
GROUP BY companies.id 

這將只返回恰好有3條記錄/能力的公司。

+0

注:這將返回不正確的結果,如果一個公司擁有同樣的能力不止一次。 – RedFilter

+0

@RedFilter同意了,這就是爲什麼我特別提到每傢俱有特定能力的公司只有一次。 – Joel

+0

我只能接受一個答案,但這對我也有效,謝謝Joel –