Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么使用union all的查询不起作用_Mysql_Sql_Select - Fatal编程技术网

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
值的示例记录,以便我们找到解决方案。