2011-08-31 66 views
4

它已经,因为我用SQL所以我问,对不起,如果它太容易了一会儿。 我必须选择用户拥有的所有技能,所以我有三张桌子。SQL - 选择所有技能

User (id, name) 
Skills (id, name) 
User_skills (id_user, id_skill) 

如果user1有2技能;例如休眠(ID 1)和Java(ID 2) 和user2有1技能; Java(编号1
通过12,我想要检索具有两者的用户。

随着IN()函数,我得到的所有具有的技能至少一个用户,但我想他们过滤掉!
感谢所有提前

+2

什么口味的RDBMS您使用的是? –

+0

起初,我认为这将是一个约具有关于技能问题'选择*' – CheeseConQueso

回答

8

如果一个技能只能分配给用户一次(即(id_user,id_skill)是user_skills表的PK),那么以下摹会做你想要什么:

SELECT id_user 
FROM user_skills 
WHERE id_skill IN (1,2) 
GROUP BY id_user 
HAVING count(*) = 2 
+0

+1打我给它。我通常也会查看这个链接以及http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/ –

3

加入到关联表user_skills两次,把技能ID每个on条款中加入:

select u.* 
from user u 
join user_skills us1 on us1.id_user = u.id and us1.id_skill = 1 
join user_skills us2 on us2.id_user = u.id and us2.id_skill = 2 

通过使用join(而不是left join)此查询要求用户有技能

0
SELECT name FROM user as u 
WHERE 
    EXISTS(SELECT 1 FROM User_skills WHERE id_user=u.id AND id_skill=1) 
    AND EXISTS(SELECT 1 FROM User_skills WHERE id_user=u.id AND id_skill=2)