【问题标题】:MySQL IFNULL not returning default valueMySQL IFNULL 不返回默认值
【发布时间】:2012-11-03 21:14:15
【问题描述】:
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
)

【问题讨论】:

    标签: mysql count ifnull


    【解决方案1】:

    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
    

    【讨论】:

    • 此查询也只会返回类别 1 和类别 3,类别 2 不存在因此不会出现在结果集中。
    【解决方案2】:

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

    【讨论】:

    • 好的,我明白了,COUNT 不会返回 NULL。我可以得到我所期望的解决方案吗?
    • 你有分类表吗?那张桌子有类别 2 吗?
    • 是的,我有一个类别表。但是对于这个特定的问题,我创建了一个测试数据库并且只有这个表。所以除了使用 join 和手动验证结果(正如我在 bonCodigo 上评论的那样)之外,没有其他方法可以做到吗?
    • 我没有看到没有左连接的方法。
    【解决方案3】:

    实际上不可能生成包含表中不存在的类别的行。

    您应该有另一个包含所有类别的表,然后像这样使用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;
    

    【讨论】:

      【解决方案4】:

      数据库引擎应该在哪里获取 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
      

      【讨论】:

      • 这正是我在回答的第一部分中的意思。幸运的是,Igor 很高兴给你代码 :-)
      【解决方案5】:

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

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

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

      【讨论】:

      • 我现在就是这样做的,SELECT 也是查询中的类别。和 (PHP) foreach...if(!array_key_exists())...$cat[2][total] = 0; $cat[2][活跃] = 0;只是想知道我是否可以在一个 sql 查询中做到这一点。
      • 实际上,人们并不打算在空间中包装有关对象的东西,但您的数据库:D 也许您可以在this discussion 上找到一些想法,但是随着部门数量的增加,这将是超级klugey查询....
      猜你喜欢
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 2018-12-12
      • 2019-02-22
      • 2018-08-04
      • 2015-03-17
      • 2021-02-09
      相关资源
      最近更新 更多