【问题标题】:MySQL include zero rows when using COUNT with GROUP BYMySQL 在使用 COUNT 和 GROUP BY 时包含零行
【发布时间】:2010-10-04 13:31:37
【问题描述】:

我正在尝试执行一个查询,该查询通过一个名为 type_id 的属性对一组数据进行分组。

SELECT
vt.id AS voucher_type,
COALESCE(COUNT(v.id), 0) AS vouchers_remaining
FROM
vouchers v
INNER JOIN voucher_types vt
ON vt.id = v.type_id
WHERE
v.sold = 0
GROUP BY vt.id

我想要的结果是 type_id 和每种类型剩余的未售出产品数量。如果至少还剩一个,这可以正常工作,但是如果有零计数行,则不会在结果集中返回。

如何为那些没有相应行数的类型设置一个虚拟行?

任何建议将不胜感激。

谢谢

【问题讨论】:

    标签: mysql count group-by


    【解决方案1】:

    您必须使用LEFT JOIN 而不是INNER JOIN。您首先选择所有 voucher_types,然后离开加入以查找计数。

    SELECT
      voucher_types.id AS voucher_type,
      IFNULL(vouchers_count.vouchers_remaining, 0) AS vouchers_remaining
    FROM
      voucher_types
    LEFT JOIN
      (
        SELECT
        v.type_id AS voucher_type,
        COUNT(v.id) AS vouchers_remaining
        FROM
        vouchers v
        WHERE
        v.sold = 0
        GROUP BY v.type_id
      ) AS vouchers_count
      ON vouchers_count.voucher_type = voucher_types.id
    

    【讨论】:

      【解决方案2】:

      您想要一个 OUTER JOIN(或 LEFT JOIN,相同的区别)而不是 INNER JOIN。这应该已经成功了。

      【讨论】:

        【解决方案3】:

        因为您正在执行 INNER JOIN,所以您会自动排除没有相应凭证的类型。你需要一个右外连接。

        另外,据我所知,COUNT 总是会给你一个整数,所以不需要 COALESCE。

        祝你好运, 阿林

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-16
        • 1970-01-01
        • 1970-01-01
        • 2020-05-17
        • 2015-09-22
        相关资源
        最近更新 更多