1
id 类别活跃
----------------------
1 1 1
2 3 0
3 3 1
4 3 1
5 1 0

我想选择total count of each categorycount of active in each cateogry

由于没有category=2,所以我使用了IFNULL,但它没有返回0

选择
    IFNULL(COUNT(id), 0) AS 总计,
    SUM(CASE WHEN 激活 = 1 THEN 1 ELSE 0 END) 激活
从
    桌子
在哪里
    类别 IN (1,2,3)
通过...分组
    类别

结果返回了 2 个数组,而不是预期的 3 个

// 类别=1的结果
大批
(
    [总计] => 2
    [活跃] => 1
)
// 结果来自类别 = 3
大批
(
    [总计] => 3
    [活跃] => 2
)

我怎样才能让 category=2 进入结果

// 类别=2的结果
大批
(
    [总计] => 0
    [活跃] => 0
)
4

5 回答 5

1

您的查询返回了正确的结果,而不是您期望的结果, COUNT 是一个分组子句,只对现有值进行分组,它不会返回 = 到 category=2 因为这个类别不存在。

于 2012-11-15T09:39:13.240 回答
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
于 2012-11-15T09:49:29.567 回答
0

你怎么能指望一个不存在的组 ;-) 除非你有一个类别 PARENT 表,你想在这里加入以获得你想要的东西。

否则,您可以使用额外的子句来验证您的数组是否存在不可用的类别,并手动注入代码行以在最终输出中显示它们。

因此,当所有类别都可用时,其他快乐日子,您的验证就可以完成工作。

于 2012-11-15T09:50:07.160 回答
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;
于 2012-11-15T09:44:32.833 回答
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
于 2012-11-15T09:37:57.573 回答