我有一个表,我们有人的用户名和他们可以说的语言。只有两列,用户标识和语言。查询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