查询SELECT所有使用所有指定语言的用户

时间:2011-05-19 10:13:35

标签: sql database join

我有一张桌子,我们有人民用户和他们可以说话的语言。只有两列,用户ID和语言。

我想找到所有可以说印度语和英语,德语和法语的用户。 我该怎么写这个查询?我不能使用内部加入4次。检查语言数量的问题可能会增加,我可能想检查更多语言。

userid |语言
      1 |英语
      4 |英语
      1 |法国
      1 |德国
 .................

4 个答案:

答案 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)