我有一個表,我們有人的用戶名和他們可以說的語言。只有兩列,用戶標識和語言。查詢SELECT選擇說所有指定語言的所有用戶
我想找到所有可以說印地語和英語,德語和法語的用戶。 我應該如何編寫這個查詢?我無法使用Inner Join 4次。問題是檢查語言的數量可能會增加,我可能想要檢查更多的語言。
userid |語言
1 |英語
4 |英文
1 |法語
1 |德國
.................
我有一個表,我們有人的用戶名和他們可以說的語言。只有兩列,用戶標識和語言。查詢SELECT選擇說所有指定語言的所有用戶
我想找到所有可以說印地語和英語,德語和法語的用戶。 我應該如何編寫這個查詢?我無法使用Inner Join 4次。問題是檢查語言的數量可能會增加,我可能想要檢查更多的語言。
userid |語言
1 |英語
4 |英文
1 |法語
1 |德國
.................
如果使用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
你可以使用一個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')
您可以使用子查詢:
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;
+1喜歡它,比使用相關的子查詢。 – 2011-05-19 10:34:44
它是 - 唯一仍然有點不穩定的是,你必須知道你正在尋找多少種語言。如果您使用PHP或其他服務器端語言來構建查詢,那麼通常不會有問題,但是誰又知道 - OP沒有具體說明這個問題:)。 – mingos 2011-05-19 10:36:27
您可以將語言加載到表變量@Languages中,然後執行'WHERE語言IN(SELECT * FROM @Languages)'並聲明@Count =(SELECT COUNT(*)FROM @Languages)'HAVING cnt = @ Count'? – 2011-05-19 10:40:39
我想,你沒有語言的數量和名稱,然後您應該嘗試以下查詢...
select userid
from UserLanguage
group by userid
having count(language)= (select count(distinct language) from userid)
您可以使用'group by'和'count'。 Google「關係部門」 – 2011-05-19 10:19:08
或[請參閱此鏈接](http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/) – 2011-05-19 10:25:39
COUNT(*)和GROUP BY只會給你每個用戶講多少種語言,而不是哪種語言。 – 2011-05-19 10:26:27