【问题标题】:SQL Count returns too many rowsSQL Count 返回太多行
【发布时间】:2014-07-23 19:32:07
【问题描述】:

我有以下 SQL 语句:

    SELECT 
    O.id,
    O.name,
    (SELECT 
            COUNT(U.id)
        FROM
            User U
        WHERE
            U.organization_id = O.id) AS num_users
FROM
    Organization O

用户表和组织表被称为organization_id的东西绑定

当我执行此语句时,我得到以下(坏)结果:

id |  name   | num_users
------------------------
 1 |  MyOrg  |     2
 2 |  MyOrg  |     0
 3 | testOrg |     0

谁能告诉我如何得到一个只会产生 1 行 pr 的结果。组织?

请注意,我已尝试使用 DISTINCT 但没有得到更好的结果

【问题讨论】:

  • DISTINCT 将无法工作,因为 id 编号是唯一的。
  • SELECT DISTINCT O.name, (SELECT COUNT(U.id) FROM User U WHERE U.organization_id = O.id) AS num_users FROM Organization O 也不起作用
  • @Marc Rasmussen:所以您的表称为组织,每个组织都有一个 ID,但是两个组织实际上只是一个组织,以防它们的名称匹配?这是你说的吗???
  • 您似乎拥有多个名为“MyOrg”的组织。结果对我来说似乎很好,但是您想如何处理这种情况?请出示您想要的结果。

标签: mysql sql join count left-join


【解决方案1】:

SQL Fiddle 演示以下查询:

SELECT GROUP_CONCAT(DISTINCT o.id SEPARATOR ', '), O.name, 
       COUNT(U.organization_id) AS MyCount
FROM Organization O
LEFT JOIN User U ON U.organization_id = O.id
GROUP BY O.name;

或者,如果您不需要 id 字段,那么:

SELECT O.name, COUNT(U.organization_id) AS MyCount
FROM Organization O
LEFT JOIN User U ON U.organization_id = O.id
GROUP BY O.name;

【讨论】:

  • 使用INNER JOIN,您不会得到任何0 计数。
  • 使用LEFT JOINCOUNT(*),拥有0 个用户的组织会人为地将计数加1。例如。 'MyOrg' 将显示 3 个用户,而应该是 2 个。
  • @Marcus Adams,我使用UNION 更新了我的答案,以获取不在第一个查询中的所有o.id
  • 我更喜欢你的第一个答案。提示:只需将COUNT(*) 更改为COUNT(U.organization_id)
  • Marcus Adams,哇,谢谢,我不知道我在想什么。我更新了我的答案。这可能是星期二,但我的大脑似乎像星期一一样工作。我自己应该注意到的。
猜你喜欢
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 2011-12-01
  • 2021-05-29
  • 1970-01-01
  • 2017-05-02
相关资源
最近更新 更多