2011-05-19 38 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) 
相关问题