将 COUNT 与 GROUP BY 和 FIELD 一起使用,计算值不存在的行

Using COUNT with GROUP BY and FIELD counting rows where value does not exist

我写标题的时间比写这个的时间还多post 哈哈。我希望它有意义。

我不确定这是否可行,但我有一个声明,我需要使用 GROUP BY statusFIELD(status, 'value1', 'value2', 'value3', 'value4', 'value5').

计算具有特定值的总记录数

问题是在我的 FIELD 值(值 1、值 2...)中,该值可能不存在于任何记录中,所以我需要计数到 return 0

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

returns

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

如您所见,它可以很好地计算所有记录,但问题是任何记录中都没有 value4,所以它 return 什么都没有。我需要它做的是 return

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

我也在搞乱 IFNULL(COUNT(*), 0)IFNULL(status, 0) 但它 return 与缺失值的结果相同。基本上,我需要指定我正在寻找的值和 return 0 如果 none 存在。

我也试过 HAVING status = 'value1' OR status = 'value2' OR status = 'value3' OR status = 'value4' OR status = 'value5' 但是添加这个也不行 return 0 就缺少了 row/value.

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

您可以对所有状态使用 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

您需要一个包含 returns 2 列的查询:您想要的 status 值以及每个状态的顺序。
然后使用 LEFT 连接和聚合将 table 连接到该查询:

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;