我正在尝试执行一个查询,该查询通过名为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和每种类型剩余未售出产品的数量。这个工作正常,只要至少有一个,但是如果有一个零计数行,它不会在结果集中返回。
如何为那些没有任何相应行计数的类型设置虚拟行?
非常感谢任何建议。
由于
答案 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。
祝你好运, 阿林