2014-01-24 40 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 –