2013-02-05 41 views
1

我有以下查询:为什么这个查询使用UNION ALL不工作

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

+0

的'WHERE bulk_sms_id = 52'是可能的罪魁祸首...... – PinnyM

回答

5

移动从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; 
+0

+1,以由相同的答案秒赢得三通比赛。 – Matthew

+0

它为'bulk_sms_numbers'中不存在的值计数一个,我首先需要它计数0 – Cesar

+0

,其中'bulk_sms_id'列位于何处?第二,你使用'COUNT(*)'?你看过ny小提琴演示吗? –

0

尝试也给列名于一切,改变ON是有条件的

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; 
1

尝试移动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; 
0

我最终使用的查询是这样的:

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']; 
} 

Althought这样做解决了我的问题,是不是我的问题的答案。 我想找到一个纯粹的SQL答案。

相关问题