如何在多个表的 COUNT 聚合中计算零结果?

Posted

技术标签:

【中文标题】如何在多个表的 COUNT 聚合中计算零结果?【英文标题】:How to count zero results in COUNT aggregate across multiple tables? 【发布时间】:2018-07-08 19:42:44 【问题描述】:

我有 3 个示例表: 1. 人

PID         PNAME                         
----------- ------------------------------
111111111.  James Brock
222222222.  Dean Sampson
333333333.  Adam Klein
444444444.  Sam Toggle

    公司

    CID CNAME


      A公司 公司B C公司 D公司

    工作

    PID CNAME


      公司B A公司 A公司 C公司

我想显示每家公司的员工人数,包括那些没有任何员工的员工(即:0 人)

所以到目前为止我有这个:

SELECT CNAME, COUNT(*) as EMPLOYEES
    FROM PERSON P, WORKING W, COMPANY C
    WHERE P.PID = W.PID
        AND W.CNAME = C.CNAME
    GROUP BY CNAME;

返回:

CNAME       EMPLOYEES                         
----------- ------------------------------
Company A   2
Company B   1
Company C   1

请注意,D 公司不见了

我想要这个:

CNAME       EMPLOYEES                         
----------- ------------------------------
Company A   2
Company B   1
Company C   1
Company D   0

有没有我可以采取的方法来获得我想要的结果?我在网上找到的所有其他示例仅使用 2 个表进行匹配。

【问题讨论】:

工作中的 PID 与实际的不对应。工作表将不包含 cname,而是包含 cid。只有这样你才需要加入三个表。 【参考方案1】:

永远不要FROM 子句中使用逗号。 始终使用正确、明确的JOIN 语法。然后,LEFT JOIN 就很明显了。

SELECT C.CNAME, COUNT(W.PID) as EMPLOYEES
FROM COMPANY C LEFT JOIN
     WORKING W
     ON W.CNAME = C.CNAME
GROUP BY C.CNAME;

请注意,JOINPERSON 是不必要的。你只是在数人,而不是查他们的名字。

【讨论】:

以上是关于如何在多个表的 COUNT 聚合中计算零结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新作为 MySQL 中另一个表的聚合结果的字段?

3.聚合与排序

1.表的聚合查询(和平均最大最小值)

合并多个平均值而不计算总计

如何在一个值之前的值上计算聚合函数 COUNT(DISTINCT)?

如何从多个聚合表中检索数据?