2013-10-11 58 views
2

statment我有3個表:Mysql的 「where」 和 「和」 多行

users 
+---------+ 
|id | name| 
+---------+ 
|1 | Tom | 
|2 | Adam| 
+---------+ 
skills 
+------------+ 
|id |name | 
+------------+ 
|1 |baking | 
|2 |driving| 
|3 |etc | 
+------------+ 

users_skills 
+-----------------+ 
|user_id |skill_id| 
+-----------------+ 
| 1  | 1 | 
| 1  | 2 | 
| 2  | 1 | 
| 2  | 2 | 
| 2  | 3 | 
+-----------------+ 

所以結果我有兩個用戶:

  • 湯姆有1和2個技能
  • 亞當哈斯1和2和3技能

我想獲得具有完全技能1和2的所有用戶,所以我想得到湯姆。如何實現這一目標?

如果我想獲得用戶的技能1和技能2 - 這不是一個問題,但它是:(

基本上我想加入用戶users_skills表,但我得到的是這樣的:

+-----------------------+ 
|user_id |name |sill_id| 
+-----------------------+ 
|1  |Tom | 1 | 
|1  |Tom | 2 | 
+-----------------------+ 
etc 

所以我有兩行,我不知道如何實現,在這裏發言。

最好的問候,

+0

您正在尋找'GROUP BY users.id' – cmorrissey

回答

0

這是解決方案。棘手的部分是這樣的事實,不僅要匹配這些技能,而且也不匹配任何它們。

SELECT u.id, u.name, us.skill_id FROM users u 
JOIN users_skills us ON u.id = us.user_id 
WHERE u.id IN (
    SELECT user_id FROM users_skills 
    WHERE user_id NOT IN (
    SELECT user_id FROM users_skills 
    WHERE skill_id NOT IN (1, 2) 
) 
    GROUP BY user_id 
    HAVING COUNT(DISTINCT skill_id) = 2 
) 

小提琴here。注意我還增加了額外的用戶和技能來測試所有情況。

總之:你首先擺脫那些有額外不需要的技能,然後你擺脫那些比所需技能少的人。

輸出:

| ID | NAME | SKILL_ID | 
|----|------|----------| 
| 1 | Tom |  1 | 
| 1 | Tom |  2 | 
+0

這正是我想要的問題。但是,是否有可能改變這種情況與另一種情況一起工作。我想讓所有具有特定技能的用戶,例如只有第三個。根據你的例子,我應該得到亞當,卡爾和邁克。對於1,2我應該得到亞當和湯姆。可能嗎? – Krystian

+0

只需在'IN'子句中更新所需技能,並更改'HAVING'子句以反映'IN'子句中項目的數量。 –

0

您需要DISTINCT函數( GROUP BY):

SELECT DISTINCT(u.name) 
FROM users AS u 
JOIN users_skills AS us 
ON u.id = us.user_id 
WHERE us.skillID IN (1,2) 
GROUP BY u.id 
+1

不太去上班 - 這將選擇'Adam'過,作爲實體也有技巧1和2(和3,這是問題)。此外,您不需要在同一個選擇子句中同時使用「DISTINCT」和「GROUP BY」。而且,你遇到了一個潛在危險的mySQL'功能',它可以給出微妙的錯誤結果;在這種情況下它是安全的(給定表格佈局),但是大多數其他RDBMSs會爲你想要提取的內容拋出語法錯誤。 –