【问题标题】:Find number of joins by a reference table通过引用表查找连接数
【发布时间】:2011-04-21 18:26:30
【问题描述】:

如果标题含糊不清,我深表歉意,但我想不出一个好的方法来命名这个问题。

在我的数据库中,我有一个连接表 A 和 B 的表 J。也就是说,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?将不胜感激。

  • 伊恩

【问题讨论】:

    标签: mysql database join count


    【解决方案1】:

    您需要在此处使用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
    

    【讨论】:

    • 这会将 FF 字段留空。他们是否还需要添加: ISNULL(COUNT(*), 0)
    • 不,它不会是空白的,它会是 1,因为该代码有 is 1 行(a_id 中有 NULL 的行)。您需要 COUNT(a_id) 来仅计算非 NULL 值。
    【解决方案2】:

    您需要使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多