通过引用表查找联接数

时间:2011-04-21 18:26:31

标签: mysql database join count

如果标题含糊不清,请道歉,但我无法找到解决这个问题的好方法。

在我的数据库中,我有一个表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?非常感谢。

  • 伊恩

2 个答案:

答案 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