Mysql 通过引用表查找联接数

Mysql 通过引用表查找联接数,mysql,database,join,count,Mysql,Database,Join,Count,如果标题模棱两可,我深表歉意,但我想不出一个好办法来命名这个问题 在我的数据库中,我有一个连接表a和表B的表J。也就是说,J有a_id列和B_id列,分别保存a和B中条目的id。B中还有一个“代码”列;例如,假设有三个条目的代码为“CC”、“DD”和“EE” 现在,我想写一个查询,列出B中有多少a具有每种类型的代码(有多少a具有“CC”,有多少具有“DD”,有多少具有“EE”) 我按如下方式编写该查询,并得到以下输出(当然是伪造的数据——按字母代码顺序排序): 当我向B添加一条新记录(比如代码为

如果标题模棱两可,我深表歉意,但我想不出一个好办法来命名这个问题

在我的数据库中,我有一个连接表a和表B的表J。也就是说,J有a_id列和B_id列,分别保存a和B中条目的id。B中还有一个“代码”列;例如,假设有三个条目的代码为“CC”、“DD”和“EE”

现在,我想写一个查询,列出B中有多少a具有每种类型的代码(有多少a具有“CC”,有多少具有“DD”,有多少具有“EE”)

我按如下方式编写该查询,并得到以下输出(当然是伪造的数据——按字母代码顺序排序):

当我向B添加一条新记录(比如代码为“FF”)时,问题就出现了。现在,我在J中没有指向代码“FF”的条目。因此,在输出中,我想包括'FF',但显示计数为0(没有A连接到'FF')

但是,在我当前的查询中,它并没有这样做,事实上,它忽略了结果计数为0的所有代码

是否有任何查询主控程序可以帮助我修改查询以包含所有代码的计数,无论它们是否为0?我们将不胜感激

  • 伊恩

您需要在此处使用
左连接来执行此操作。
左联接将为您提供表
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

您需要使用左联接:

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

这将使FF的字段留空。他们是否也需要添加:ISNULL(COUNT(*),0)不,它不是空的,它应该是1,因为该代码有1行(在一个_id中有NULL的那一行)。您需要COUNT(a_id)来只计算非空值。
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
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