【问题标题】:MySQL Select multiple count in one queryMySQL在一个查询中选择多个计数
【发布时间】:2014-11-09 20:48:41
【问题描述】:

我有 2 张桌子 - departmentsemployees。我想从departments 中选择所有列,并添加一个列,其中包含子部门数和每个部门的员工数。

简化后的表格如下所示:

departments:

id      name            parent_id
---------------------------------
1       IT              NULL
2       HR              NULL
3       Bussiness       NULL
4       Web dev         1
5       Ecommerce       4
6       Advertisement   3
7       Control         3
8       Programmers     1

employees:

id      name            department_id
---------------------------------
1       Adam            1
2       Ben             8
3       Charles         7
4       David           4
5       Eugen           4
6       Frank           6
7       Gustav          6
8       Heremy          4
9       Igor            5
10      Jacob           3

我想要的结果是:

id      name            parent_id       department_count      employee_count
----------------------------------------------------------------------------
1       IT              NULL            2                     1
2       HR              NULL            0                     0
3       Bussiness       NULL            2                     1
4       Web dev         1               1                     3
5       Ecommerce       4               0                     1
6       Advertisement   3               0                     2
7       Control         3               0                     1
8       Programmers     1               0                     1

这是我的查询,但它不能正常工作。但是,如果我删除了COUNT 中的 1 个,则数字是正确的。我认为NULL 值是问题所在,但我不知道解决方案。

SELECT d.*, COUNT(d2.parent_id) AS department_count, COUNT(e.id) AS employee_count
FROM department AS d
LEFT JOIN department AS d2 ON (d.id = d2.parent_id)
LEFT JOIN employees AS z ON (e.department_id = d.id)
GROUP BY d.id
ORDER BY d.id

欢迎对我的代码进行任何改进。

【问题讨论】:

  • 对不起,我的错 - 应该是 2

标签: mysql sql join count


【解决方案1】:

在你的计数函数中使用d2.id与distinct,这样一个部门的重复孩子将只计算一次

SELECT d.*,
COUNT(distinct d2.id) AS department_count,
COUNT(distinct e.id) AS employee_count
FROM department AS d
LEFT JOIN department AS d2 ON (d.id = d2.parent_id)
LEFT JOIN employees AS e ON (e.department_id = d.id)
GROUP BY d.id
ORDER BY d.id

Demo

【讨论】:

    【解决方案2】:

    您可以尝试相关查询,因为它们提供了简单的逻辑:

    SELECT d.*, 
      (SELECT COUNT(*) FROM departments WHERE parent_id = d.id) as department_count,
      (SELECT COUNT(*) FROM employees WHERE department_id = d.id) as employees_count
    FROM departments d
    

    【讨论】:

    • Correlated 可能会很慢,因为它们将针对部门表的每一行执行
    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2014-08-02
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多