将COUNT与GROUP BY一起使用时,MySQL包含零行

时间:2010-10-04 13:31:37

标签: mysql count group-by

我正在尝试执行一个查询,该查询通过名为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和每种类型剩余未售出产品的数量。这个工作正常,只要至少有一个,但是如果有一个零计数行,它不会在结果集中返回。

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

非常感谢任何建议。

由于

3 个答案:

答案 0 :(得分:3)

您必须使用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

答案 1 :(得分:0)

您需要OUTER JOIN(或LEFT JOIN,相同的差异)而不是INNER JOIN。这应该已经成功了。

答案 2 :(得分:0)

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

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

祝你好运, 阿林