将 COUNT 与 GROUP BY 和 FIELD 一起使用,计算值不存在的行
Using COUNT with GROUP BY and FIELD counting rows where value does not exist
我写标题的时间比写这个的时间还多post 哈哈。我希望它有意义。
我不确定这是否可行,但我有一个声明,我需要使用 GROUP BY status
和 FIELD(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;
我写标题的时间比写这个的时间还多post 哈哈。我希望它有意义。
我不确定这是否可行,但我有一个声明,我需要使用 GROUP BY status
和 FIELD(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;