MySQL IFNULL没有返回默认值

时间:2012-11-15 09:34:05

标签: mysql count ifnull

id    category    active
------------------------
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

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
)

5 个答案:

答案 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子句验证数组的不可用类别,并手动注入代码行以在最终输出中显示它们。

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