0

特定の日付範囲の間に存在する一連の行を選択し、その日付を持つ行の数を数えようとしています。ただし、エントリがないため、テーブルに存在しない日付が存在する可能性があります。

このテーブルには、次のデータを含む行が含まれています。

2012-12-25
2012-12-25
2012-12-27
2012-12-27
2012-12-27
2012-12-28

この質問に従って、日付範囲 MySQLを生成するための数値テーブルを作成しました。範囲内の欠落している日付を埋める方法は?

私の現在のクエリは近くで失敗します('SELECT * FROM wp_paypal_logs WHERE STR_TO_DATE(wp_paypal_logs.created, '%Y-%m-%d')

SELECT x.ts AS timestamp,
          COALESCE(COUNT(SELECT * FROM wp_paypal_logs WHERE STR_TO_DATE(wp_paypal_logs.created, '%Y-%m-%d' ) = x.ts), 0) AS cnt
     FROM (SELECT DATE_FORMAT(DATE_ADD('2012-12-25', INTERVAL n.id - 1 DAY), '%Y-%m-%d') AS ts
             FROM numbers n
            WHERE DATE_ADD('2012-12-25', INTERVAL n.id - 1 DAY) <= '2012-12-31') x
LEFT JOIN TABLE wp_paypal_logs ON STR_TO_DATE(wp_paypal_logs.created, '%Y-%m-%d') = x.ts

結果セットを次のようにするにはどうすればよいですか?

2012-12-25      2
2012-12-26      0
2012-12-27      3
2012-12-28      1
4

1 に答える 1

1

COALESCEトリックを実行する可能性のある左側の結合されたテーブルからのフィールドを期待する場合、あなたが ing を行っているため、その部分が必要かどうかLEFT JOINはわかりません (NULL をカウントしないため):

SELECT 
   x.ts AS timestamp,
   COUNT(wp_paypal_logs.created) AS cnt
FROM (
    SELECT 
       DATE_FORMAT(DATE_ADD('2012-12-25', INTERVAL n.id - 1 DAY), '%Y-%m-%d') AS ts
    FROM numbers n
    WHERE DATE_ADD('2012-12-25', INTERVAL n.id - 1 DAY) <= '2012-12-31'
) x
LEFT JOIN wp_paypal_logs 
   ON STR_TO_DATE(wp_paypal_logs.created, '%Y-%m-%d') = x.ts
GROUP BY x.ts
于 2013-01-11T17:13:03.977 に答える