【问题标题】:Query for SELECT all users who speak all the specified languages查询 SELECT 使用所有指定语言的所有用户
【发布时间】:2011-05-19 10:13:34
【问题描述】:

我有一张表格,我们有人们的用户 ID 和他们可以说的语言。只有两列,用户 ID 和语言。

我想找到所有会说印地语、英语、德语和法语的用户。 我应该如何编写这个查询?我不能使用 Inner Join 4 次。问题是检查语言数量可能会增加,我可能想检查更多语言。

用户名 |语言
1 |英文
4 |英文
1 |法语
1 |德语
....................

【问题讨论】:

  • 您可以使用group bycount。谷歌“关系部门”
  • COUNT(*) 和 GROUP BY 只会告诉你每个用户说多少种语言,而不是哪种语言。
  • @Chris。你使用 WHERE language in('english','hindi', 'french','german')GROUP BY userid 然后检查 HAVING COUNT(DISTINCT language) = 4

标签: sql database join


【解决方案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

【讨论】:

  • +1 用于团体解决方案 - 与我的建议相同,但查询更简单:)
  • 谢谢马文。它工作得很好。我不明白为什么最后添加了 >=4,我想检查应该只针对 =4,因为只检查了 4 种语言?你能详细说明一下吗。谢谢
  • SQL Server 中内置的 GROUP_CONCAT 聚合函数已经等待了大约 10 年。还在等待。 +1 顺便说一句,很好的答案。
【解决方案2】:

您可以使用子查询:

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;

【讨论】:

  • 这是 - 唯一仍然有点不稳定的是你必须知道你正在寻找多少种语言。如果您使用 PHP 或其他服务器端语言来构建查询,这通常不是问题,但话又说回来,谁知道 - OP 对此并不具体:)。
  • 您能否将语言加载到表变量@Languages 中,然后执行WHERE language IN (SELECT * FROM @Languages) 并拥有declare @Count = (SELECT COUNT(*) FROM @Languages)HAVING cnt = @Count
  • 是的,having 是要走的路:)
【解决方案3】:

你可以使用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')

【讨论】:

    【解决方案4】:

    我认为由于您没有语言的计数和名称,因此您应该尝试以下查询...

    select userid 
    from UserLanguage 
    group by userid 
    having count(language)= (select count(distinct language) from userid)
    

    【讨论】:

      猜你喜欢
      • 2017-12-21
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多