id category active ------------------------ 1 1 1 2 3 0 3 3 1 4 3 1 5 1 0
我想选择total count of each category
和count of active in each cateogry
。
由于没有category = 2,我使用了IFNULL,但它没有返回0
SELECT IFNULL(COUNT(id), 0) AS total, SUM(CASE WHEN active = 1 THEN 1 ELSE 0 END) AS active FROM table WHERE category IN (1,2,3) GROUP BY category
结果返回2个数组,而不是预期的3个
// result from category=1 Array ( [total] => 2 [active] => 1 ) // result from category=3 Array ( [total] => 3 [active] => 2 )
如何将category = 2纳入结果
// result from category=2 Array ( [total] => 0 [active] => 0 )
答案 0 :(得分:1)
您的查询返回正确的结果,而不是您期望的结果,COUNT是分组子句,只对现有值进行分组,它不会返回= category = 2,因为此类别不存在。
答案 1 :(得分:0)
Count(*)永远不会返回null
试试这个:
SELECT
COUNT(id) AS total,
SUM(CASE WHEN active = 1 THEN 1 ELSE 0 END) AS active
FROM
table
WHERE
category IN (1,2,3)
GROUP BY
category
答案 2 :(得分:0)
实际上不可能生成包含表中不存在的类别的行。
您应该有另一个包含所有类别的表,然后使用LEFT JOIN
,如下所示:
SELECT categories.category,
COUNT(*) AS total,
SUM(`table`.active)
FROM categories
LEFT JOIN `table` USING (category)
WHERE categories.category IN (1,2,3)
GROUP BY categories.category;
答案 3 :(得分:0)
数据库引擎应该为id = 2?
获取行您需要从类别表中进行选择,然后从另一个表中进行计数。
至于你的需要查询应该是这样的(我没有检查因为我的数据库中没有你的表和数据)
SELECT
c.id,
COUNT(t.id) AS total,
SUM(CASE WHEN t.active = 1 THEN 1 ELSE 0 END) AS active
FROM
categories_table AS c
LEFT JOIN table AS t ON c.id=t.category
WHERE
c.id IN (1,2,3)
GROUP BY
t.category
答案 4 :(得分:0)
你怎么能指望一个不存在的团体;-)除非你有一个类别PARENT表,你想在这里加入你想要的东西。
否则,您可以使用extra子句验证数组的不可用类别,并手动注入代码行以在最终输出中显示它们。
因此,当所有类别都可用时,其他日子快乐,您的验证就可以完成工作。