【问题标题】:Using COUNT with GROUP BY and FIELD counting rows where value does not exist将 COUNT 与 GROUP BY 和 FIELD 一起使用计数不存在值的行
【发布时间】:2021-09-06 18:12:21
【问题描述】:

我写标题的时间比写这篇文章的时间还多,哈哈。我希望这是有道理的。

我不确定这是否可行,但我有一个声明,我需要使用 GROUP BY statusFIELD(status, 'value1', 'value2', 'value3', 'value4', 'value5') 计算具有特定值的总记录数。

问题是在我的FIELD 值(value1,value2...)中,该值可能不存在于任何记录中,因此我需要计数返回 0

SELECT COUNT(*),status FROM table WHERE some_field = 12345 GROUP BY status ORDER BY FIELD(status, 'value1', 'value2', 'value3', 'value4', 'value5');

返回

|COUNT(*)|status|
|3       |value1|
|9       |value2|
|12      |value3|
|34      |value5|

正如您所见,它对所有记录的计数都很好,但问题是任何记录中都没有value4,因此它什么也不返回。我需要它做的是返回

|COUNT(*)|status|
|3       |value1|
|9       |value2|
|12      |value3|
|0       |value4|
|34      |value5|

我也搞砸了IFNULL(COUNT(*), 0)IFNULL(status, 0),但它返回的结果与缺失值相同。基本上,我需要指定我要查找的值,如果不存在则返回 0。

我也尝试了HAVING status = 'value1' OR status = 'value2' OR status = 'value3' OR status = 'value4' OR status = 'value5',但添加它也不会在丢失的行/值上返回 0。

【问题讨论】:

    标签: mysql group-by count left-join union


    【解决方案1】:

    您需要一个返回 2 列的查询:您想要的 status 值和每个状态的顺序。
    然后使用 LEFT 连接和聚合将表连接到该查询:

    SELECT s.status, COUNT(t.status) counter
    FROM (
      SELECT 1 id, 'value1' status UNION ALL
      SELECT 2, 'value2' UNION ALL
      SELECT 3, 'value3' UNION ALL
      SELECT 4, 'value4' UNION ALL
      SELECT 5, 'value5'
    ) s LEFT JOIN tablename t
    ON t.status = s.status AND t.some_field = 12345
    GROUP BY s.id, s.status
    ORDER BY s.id;
    

    【讨论】:

    • 我应该把WHERE 子句放在哪里?
    • @CesarBielich ON 子句。查看我编辑的代码。
    • 完美!非常感谢
    【解决方案2】:

    你必须加入完整的数据列表

    您可以对所有状态使用 UNION

    SELECT
        IFNULL(t1.count_1,0) "count", t2.status
    FROM
    (SELECT 
        COUNT(*) count_1, status
    FROM
        table1 
    WHERE
        some_field = 12345
    GROUP BY status
    ORDER BY FIELD(status,
            'value1',
            'value2',
            'value3',
            'value4',
        'value5')) t1
            RIGHT JOIN (SELECT 
            'value1' as status
            UNION ALL
            SELECT 'value2'
            UNION ALL
            SELECT 'value3'
            UNION ALL
            SELECT 'value4'
            UNION ALL
            SELECT 'value5') st1 on t1.status = st1.status
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      相关资源
      最近更新 更多