MySQL在一个查询中选择多个计数

Wel*_*oud 2 mysql sql join count

我有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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我想要的结果是:

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
Run Code Online (Sandbox Code Playgroud)

这是我的查询,但它无法正常工作.但是,如果我删除1 COUNT,那么数字是正确的.我认为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
Run Code Online (Sandbox Code Playgroud)

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

M K*_*aid 6

使用d2.id在不同的计数功能,所以对于一个部门重复孩子将只计算一次

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
Run Code Online (Sandbox Code Playgroud)

Demo