我有一张桌子,我们有人民用户和他们可以说话的语言。只有两列,用户ID和语言。
我想找到所有可以说印度语和英语,德语和法语的用户。 我该怎么写这个查询?我不能使用内部加入4次。检查语言数量的问题可能会增加,我可能想检查更多语言。
userid |语言
1 |英语
4 |英语
1 |法国
1 |德国
.................
答案 0 :(得分: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
答案 1 :(得分: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;
答案 2 :(得分: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')
答案 3 :(得分:0)
我认为,由于您没有语言的计数和名称,因此您应该尝试以下查询......
select userid
from UserLanguage
group by userid
having count(language)= (select count(distinct language) from userid)