1

次のクエリがあります。

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を使用しています

4

4 に答える 4

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;
于 2013-02-05T16:23:04.910 に答える
1

WHERE 条件を ON 句に移動し、OUTER 結合を使用してみてください。

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;
于 2013-02-05T16:24:40.580 に答える
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;
于 2013-02-05T16:23:31.090 に答える
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'];
}

これは私の問題を解決しますが、私の質問に対する答えではありません。純粋なSQLの答えを見つけたいです。

于 2013-03-04T20:02:59.760 に答える