2011-05-19 27 views
2

我有一個表,我們有人的用戶名和他們可以說的語言。只有兩列,用戶標識和語言。查詢SELECT選擇說所有指定語言的所有用戶

我想找到所有可以說印地語和英語,德語和法語的用戶。 我應該如何編寫這個查詢?我無法使用Inner Join 4次。問題是檢查語言的數量可能會增加,我可能想要檢查更多的語言。

userid |語言
1 |英語
4 |英文
1 |法語
1 |德國
.................

+0

您可以使用'group by'和'count'。 Google「關係部門」 – 2011-05-19 10:19:08

+0

或[請參閱此鏈接](http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/) – 2011-05-19 10:25:39

+0

COUNT(*)和GROUP BY只會給你每個用戶講多少種語言,而不是哪種語言。 – 2011-05-19 10:26:27

回答

8

如果使用MySQL,你可以做這樣的事情(指被調試,未測試):

SELECT userid FROM (
    SELECT userid, GROUP_CONCAT(language SEPARATOR ',') AS languages 
    FROM UserLanguage 
    ORDER BY userid ASC, language ASC 
    GROUP BY userid) 
WHERE languages LIKE '%english%french%german%hindi%'; 

(LIKE子句中的語言都進行排序)

How to use GROUP BY to concatenate strings in MySQL?


或者,也許更快:

SELECT userid 
FROM UserLanguage 
WHERE language IN ('fr', 'en, 'de', 'hi') 
GROUP BY userid 
HAVING COUNT(DISTINCT(language)) >= 4 
+0

+1爲有組織的解決方案 - 做的和我的建議一樣,但用更簡單的查詢:) – mingos 2011-05-19 10:41:50

+0

謝謝馬文。它效果很好。我不明白爲什麼> = 4已經添加到最後,並且我認爲檢查應該是= 4,因爲只有4種語言被檢查?你能否詳細說明一下。謝謝 – Nands 2011-05-19 11:48:05

+0

正確,= 4應該也一樣。 – 2011-05-19 12:00:05

0

你可以使用一個correlated subquery,像這樣:

SELECT UserId 
FROM UserLanguage UL1 
WHERE 
    EXISTS (SELECT * FROM UserLanguage UL2 WHERE UL2.UserId = UL1.UserId 
     AND UL2.Language = 'english') AND 
    EXISTS (SELECT * FROM UserLanguage UL2 WHERE UL2.UserId = UL1.UserId 
     AND UL2.Language = 'hindi') AND 
    EXISTS (SELECT * FROM UserLanguage UL2 WHERE UL2.UserId = UL1.UserId 
     AND UL2.Language = 'german') AND 
    EXISTS (SELECT * FROM UserLanguage UL2 WHERE UL2.UserId = UL1.UserId 
     AND UL2.Language = 'french') 
1

您可以使用子查詢:

SELECT userid 
FROM (
    SELECT userid, COUNT(*) AS cnt 
    FROM mytable 
    WHERE language IN ('hindi','german','french','english') 
    GROUP BY userid 
) AS t 
WHERE cnt = 4; 
+0

+1喜歡它,比使用相關的子查詢。 – 2011-05-19 10:34:44

+0

它是 - 唯一仍然有點不穩定的是,你必須知道你正在尋找多少種語言。如果您使用PHP或其他服務器端語言來構建查詢,那麼通常不會有問題,但是誰又知道 - OP沒有具體說明這個問題:)。 – mingos 2011-05-19 10:36:27

+0

您可以將語言加載到表變量@Languages中,然後執行'WHERE語言IN(SELECT * FROM @Languages)'並聲明@Count =(SELECT COUNT(*)FROM @Languages)'HAVING cnt = @ Count'? – 2011-05-19 10:40:39

0

我想,你沒有語言的數量和名稱,然後您應該嘗試以下查詢...

select userid 
from UserLanguage 
group by userid 
having count(language)= (select count(distinct language) from userid)