【问题标题】:How to make LEFT JOIN work with grouping/count in MySQL?如何使 LEFT JOIN 与 MySQL 中的分组/计数一起使用?
【发布时间】:2009-10-01 17:17:48
【问题描述】:

我有一个这样的查询:

SELECT type.id, type.name, COUNT(*) AS tot
FROM page
LEFT JOIN type ON page.type=type.id
GROUP BY type.id

但是,这不会选择所有类型:它会遗漏任何尚未出现在页表中的类型。我只是希望它用一个数字列出每种类型,该数字表示有多少页具有该类型,包括不出现该类型的 0。我需要不同的加入吗?

【问题讨论】:

    标签: mysql join count group-by


    【解决方案1】:

    改为使用RIGHT JOIN。试试这个:

    SELECT type.id, type.name, COUNT(page.type) AS tot
    FROM page
    RIGHT JOIN type ON page.type=type.id
    GROUP BY type.id
    

    注意不同的计数方式。对于没有的类型,page.type 将为 NULL 页。执行COUNT

    时将忽略此类行

    [编辑] 这是一个例子。如果我们有以下数据:

    类型 身份证名称 1个 2乙 3℃ 页 身份证类型 1 1 2 1 3 2

    如果我们像我的回答一样执行JOIN(不是GROUP BYCOUNT),我们的结果集将如下所示:

    type.id type.name page.id page.type 1 一个 1 1 1 一个 2 1 2 乙 3 2 3 C 空 空

    现在当我们执行GROUP BYCOUNT(type.id) 时,我们正在计算行数 其中 type.id 不为 NULL。那将是所有行:A 的结果是 2 和 1 代表 B 和 C。

    如果我们改为使用COUNT(page.type),则 A 为 2,B 为 1,C 为 0(因为 page.typeNULL 用于 C!)

    【讨论】:

    • 我在正确阅读您的答案之前使用 count(*) 进行了尝试,并且缺少的类型返回 2 作为计数。像你说的那样使用 count(page.type) 会得到 0。为什么会发生这种情况?
    • 使用 count(type.id) 似乎也返回 2。
    • COUNT(*) 计算所有行。 COUNT(page.type) 只计算 page.type 不为 NULL 的行。当您像我的回答一样执行 JOIN 时,types 的行没有 pages 将所有 page 列设置为 NULL。当我们执行COUNT(page.type) 时,我们只计算具有pagestypes 行(页面列不为空)。
    • 如果您执行COUNT(type.id),那么您将计算所有type.id 不为NULL 的行。因为我们要选择所有类型,所以它们都有 id。如果我的解释不清楚,请尝试 SELECT * 以查看查询结果。
    • 嗯,还是没听懂。我在类型表中没有任何 NULL,页表的类型字段也没有。所有其他类型都有正确的计数,但没有相应页面的这个显示为 2。
    【解决方案2】:

    左连接会带回连接表达式左侧表中的所有行,无论它们是否存在于右侧表中试试这个(切换表达式的两侧):

    SELECT type.id, type.name, COUNT(*) AS tot
    FROM  type 
    LEFT JOIN  page ON type.id=page.type
    GROUP BY type.id, type.name
    

    【讨论】:

      【解决方案3】:

      使用 Coalesce 给 NULL 赋值给 GROUP BY

      SELECT
          COALESCE(type.id, 0),
          COALESCE(type.name, 'NoType'),
          COUNT(*) AS tot
      FROM
          page
      LEFT JOIN
          type
      ON
          page.type=type.id
      GROUP BY
          COALESCE(type.id, 0),
          COALESCE(type.name, 'NoType')
      

      【讨论】:

        猜你喜欢
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多