MySQL中统计每位员工所属部门数量的查询问题
嘿,这问题其实很常见,我来给你捋清楚!
你现在的查询之所以只返回总记录数,核心原因是没有按员工分组——COUNT()函数在没有GROUP BY的时候,会把整个结果集当成一组来统计。要得到每位员工的部门数量,关键就是加上GROUP BY子句,让统计针对每个员工单独计算。
先修正你原来的写法(不用显式JOIN也可以)
你原来的隐式连接写法(用逗号分隔表+WHERE条件)是可以用的,只要加上分组:
SELECT E.eid, E.name, COUNT(D.did) AS department_count FROM employee E, department D, works W WHERE E.eid = W.eid AND W.did = D.did GROUP BY E.eid, E.name;
这里GROUP BY E.eid, E.name会把同一个员工的所有关联记录归为一组,COUNT(D.did)就会统计每组里的部门数量,也就是该员工所属的部门数。
更推荐的显式JOIN写法
虽然不是必须用JOIN,但显式的JOIN语法可读性更高,逻辑更清晰,不容易出错,现在是SQL的最佳实践:
SELECT E.eid, E.name, COUNT(D.did) AS department_count FROM employee E JOIN works W ON E.eid = W.eid JOIN department D ON W.did = D.did GROUP BY E.eid, E.name;
进阶:包含无部门的员工
如果你的员工里有没有任何部门的(也就是works表里没有对应记录),想要把这些员工也显示出来,部门数显示为0,那就要用LEFT JOIN:
SELECT E.eid, E.name, COUNT(D.did) AS department_count FROM employee E LEFT JOIN works W ON E.eid = W.eid LEFT JOIN department D ON W.did = D.did GROUP BY E.eid, E.name;
LEFT JOIN会保留employee表里的所有记录,即使没有匹配的works或department记录,此时D.did会是NULL,COUNT()会自动忽略NULL值,所以这类员工的部门数会显示为0。
总结一下:不是必须用JOIN,但显式JOIN更友好;核心是一定要用GROUP BY按员工的唯一标识(比如eid)和你想显示的字段(比如name)分组,这样COUNT()才能针对每个员工统计。
内容的提问来源于stack exchange,提问作者PUNX
相关产品推荐
相关产品推荐

