2011-08-31 92 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)