如果标题含糊不清,请道歉,但我无法找到解决这个问题的好方法。
在我的数据库中,我有一个表J连接表A和B.也就是说,J有列a_id和b_id,分别包含A和B中条目的id。 B中还有一个“代码”栏;为了举例,我们假设有三个条目的代码为“CC”,“DD”和“EE”。
现在,我想编写一个查询,列出B中每种类型的代码有多少A(有多少A有'CC',多少有'DD',有多少有'EE')。
我按如下方式编写该查询,并获得以下输出(当然,制作数据 - 按字母顺序排序):
SELECT b.CODE as code, COUNT(*) AS COUNT FROM a, b, j
WHERE j.a_id = a.id AND j.b_id = b.id
GROUP BY b.CODE ORDER BY b.CODE
code | count
==============
CC | 5
DD | 10
EE | 2
当我向B添加新记录时出现问题,例如代码为'FF'。现在在这一点上,我在J中没有指向代码'FF'的条目。所以在输出中,我想要包含'FF',但是显示计数为0(没有A连接到'FF')。
code | count
==============
CC | 5
DD | 10
EE | 2
FF | 0
但是,使用我当前的查询,它不会执行此操作,实际上会遗漏所有生成计数为0的代码。
任何查询掌握在那里可以帮助我改变我的查询以包括所有代码的计数,无论它们是否为0?非常感谢。
答案 0 :(得分:2)
您需要在此处使用LEFT JOIN
来执行此操作。 LEFT JOIN
将为您提供表b
中的所有行,无论它们是否在表j
中具有匹配的行。
SELECT b.CODE as code, COUNT(a.id) AS COUNT
FROM b
LEFT JOIN j
INNER JOIN a
ON j.a_id = a.id
ON j.b_id = b.id
GROUP BY b.CODE
ORDER BY b.CODE
答案 1 :(得分:1)
您需要使用LEFT JOIN:
SELECT b.CODE as code, COUNT(a.id) AS a_count
FROM b LEFT JOIN (j JOIN a ON j.a_id = a.id) ON j.b_id = b.id
GROUP BY b.CODE ASC