Mysql 为什么使用union all的查询不起作用
我有以下疑问:Mysql 为什么使用union all的查询不起作用,mysql,sql,select,Mysql,Sql,Select,我有以下疑问: SELECT a.status, count(a.status) FROM (SELECT 'Delivered' AS status UNION ALL SELECT 'Buffered' UNION ALL SELECT 'Not Delivered' UNION ALL SELECT 'Not Reported') a LEFT JOIN bulk_sms_numbers ON a.status = bulk_sms_numbers.delivery_status WHE
SELECT a.status, count(a.status) FROM
(SELECT 'Delivered' AS status
UNION ALL SELECT 'Buffered'
UNION ALL SELECT 'Not Delivered'
UNION ALL SELECT 'Not Reported') a
LEFT JOIN
bulk_sms_numbers
ON a.status = bulk_sms_numbers.delivery_status
WHERE bulk_sms_id = 52
GROUP BY a.status;
结果如下:
+-----------+-----------------+
| status | count(a.status) |
+-----------+-----------------+
| Buffered | 10 |
| Delivered | 3200 |
+-----------+-----------------+
我希望结果集包含union all查询中列出的所有可能状态
我需要的示例输出
+---------------+-----------------+
| status | count(a.status) |
+---------------+-----------------+
| Buffered | 10 |
| Delivered | 3200 |
| Not Delieverd | 0 |
| Not Reported | 0 |
+---------------+-----------------+
我正在使用MySql将条件从
WHERE
子句移动到ON
中,这样过滤将在加入时进行,而不是在最终结果列表中
SELECT a.status, count(a.status)
FROM
(
SELECT 'Delivered' AS status
UNION ALL SELECT 'Buffered'
UNION ALL SELECT 'Not Delivered'
UNION ALL SELECT 'Not Reported'
) a
LEFT JOIN bulk_sms_numbers
ON a.status = bulk_sms_numbers.delivery_status AND
bulk_sms_id = 52
GROUP BY a.status;
WHERE
子句移动到ON
中,这样过滤将在加入时进行,而不是在最终结果列表中
SELECT a.status, count(a.status)
FROM
(
SELECT 'Delivered' AS status
UNION ALL SELECT 'Buffered'
UNION ALL SELECT 'Not Delivered'
UNION ALL SELECT 'Not Reported'
) a
LEFT JOIN bulk_sms_numbers
ON a.status = bulk_sms_numbers.delivery_status AND
bulk_sms_id = 52
GROUP BY a.status;
更改为有条件的
SELECT a.status, count(a.status) FROM
(SELECT 'Delivered' AS status
UNION ALL SELECT 'Buffered' As status
UNION ALL SELECT 'Not Delivered' as status
UNION ALL SELECT 'Not Reported' as status) a
LEFT JOIN
bulk_sms_numbers
ON a.status = bulk_sms_numbers.delivery_status
AND bulk_sms_id = 52
GROUP BY a.status;
还可以尝试为所有列指定名称,并将
上的更改为有条件的
SELECT a.status, count(a.status) FROM
(SELECT 'Delivered' AS status
UNION ALL SELECT 'Buffered' As status
UNION ALL SELECT 'Not Delivered' as status
UNION ALL SELECT 'Not Reported' as status) a
LEFT JOIN
bulk_sms_numbers
ON a.status = bulk_sms_numbers.delivery_status
AND bulk_sms_id = 52
GROUP BY a.status;
尝试将WHERE条件移动到ON子句中并使用外部联接
SELECT a.status, count(a.status) FROM
(SELECT 'Delivered' AS status
UNION ALL SELECT 'Buffered'
UNION ALL SELECT 'Not Delivered'
UNION ALL SELECT 'Not Reported') a
LEFT OUTER JOIN
bulk_sms_numbers
ON a.status = bulk_sms_numbers.delivery_status
AND bulk_sms_id = 52
GROUP BY a.status;
尝试将WHERE条件移动到ON子句中并使用外部联接
SELECT a.status, count(a.status) FROM
(SELECT 'Delivered' AS status
UNION ALL SELECT 'Buffered'
UNION ALL SELECT 'Not Delivered'
UNION ALL SELECT 'Not Reported') a
LEFT OUTER JOIN
bulk_sms_numbers
ON a.status = bulk_sms_numbers.delivery_status
AND bulk_sms_id = 52
GROUP BY a.status;
我最终使用了如下查询:
SELECT cnt, IFNULL(delivery_status, 'Not Reported') delivery_status FROM (
SELECT delivery_status, count(delivery_status) cnt FROM bulk_sms_numbers WHERE bulk_sms_id = 52 GROUP BY delivery_status
) x
然后在php中,我将所有状态的默认值设置为0
$data = $db->fetchAll($q, array($aid, $reference));
$statuses = array(
'Buffered' => 0,
'Delivered' => 0,
'Not Delivered' => 0,
'Not Reported' => 0,
);
foreach ($data as $value) {
$statuses[$value['delivery_status']] = $value['cnt'];
}
虽然这解决了我的问题,但这并不是我问题的答案。
我想找到一个纯sql的答案。我最终使用了如下查询:
SELECT cnt, IFNULL(delivery_status, 'Not Reported') delivery_status FROM (
SELECT delivery_status, count(delivery_status) cnt FROM bulk_sms_numbers WHERE bulk_sms_id = 52 GROUP BY delivery_status
) x
然后在php中,我将所有状态的默认值设置为0
$data = $db->fetchAll($q, array($aid, $reference));
$statuses = array(
'Buffered' => 0,
'Delivered' => 0,
'Not Delivered' => 0,
'Not Reported' => 0,
);
foreach ($data as $value) {
$statuses[$value['delivery_status']] = $value['cnt'];
}
虽然这解决了我的问题,但这并不是我问题的答案。
我想找到一个纯sql的答案。bulk\u sms\u id=52的可能是罪魁祸首…bulk\u sms\u id=52的可能是罪魁祸首…+1赢得三方比赛,以秒为单位获得相同答案。对于bulk\u sms\u数字中不存在的值,它计算1
我需要它先计算0,列bulk\u sms\u id
位于何处?第二,您是否正在使用COUNT(*)
?你看到ny fiddle的演示了吗?对我原来的查询的唯一更改不是更改和的位置<代码>批量短信id
位于批量短信号码
表中。delivery\u status
列包含一些空值,我不知道这是否会导致问题。您能否给出包含NULL
值的样本记录,以便我们找到解决方案。+1表示以秒为单位赢得三方比赛以获得相同答案。如果bulk\u sms\u numbers
中不存在值,则计数1。我需要先计数0,列bulk\u sms\u id
位于何处?第二,您是否正在使用COUNT(*)
?你看到ny fiddle的演示了吗?对我原来的查询的唯一更改不是更改和的位置<代码>批量短信id
位于批量短信号码
表中。delivery\u status
列包含一些空值,我不知道这是否会导致问题。您能否提供包含null
值的示例记录,以便我们找到解决方案。