MySQL の日付ギャップを埋める
MySQL で日付ベースのクエリを使用する場合、データにギャップがある状況が発生することがあります。特定の日付の場合。これは、データの包括的なビューを表示したい場合、または日付の完全なセットに依存する計算を実行したい場合に問題になる可能性があります。
日付ギャップのあるクエリ:
この問題を実証するには、次のクエリを考えてみましょう:
SELECT DATE(posted_at) AS date, COUNT(*) AS total, SUM(attitude = 'positive') AS positive, SUM(attitude = 'neutral') AS neutral, SUM(attitude = 'negative') AS negative FROM `messages` WHERE (`messages`.brand_id = 1) AND (`messages`.`spam` = 0 AND `messages`.`duplicate` = 0 AND `messages`.`ignore` = 0) GROUP BY date ORDER BY date
このクエリは、日付ごとにグループ化された結果を返し、合計数と態度を示します。各日付の合計。ただし、データのない日付がある場合、それらは結果に含まれず、データセットにギャップが生じます。
ギャップを埋める:
埋めるにはこれらのゼロとのギャップがある場合は、ヘルパー テーブルを利用して、開始日と終了日の間の完全な日付セットを生成できます。ヘルパー テーブルは、次のクエリを使用して作成できます。
SELECT date AS dt FROM ( SELECT CURDATE() AS date UNION ALL SELECT date + INTERVAL 1 DAY FROM dates FROM dates WHERE date < DATE_ADD(CURDATE(), INTERVAL 1 YEAR) ) dates
このクエリは、1 年後に到達するまで、現在の日付に再帰的に 1 日を追加します。
Query withヘルパー テーブル:
これで、LEFT JOIN を使用してヘルパー テーブルをメイン クエリと結合し、日付を埋めることができます。ギャップ:
SELECT d.dt AS date, COUNT(*) AS total, SUM(attitude = 'positive') AS positive, SUM(attitude = 'neutral') AS neutral, SUM(attitude = 'negative') AS negative FROM dates d LEFT JOIN messages m ON m.posted_at >= d.dt AND m.posted_at < d.dt + INTERVAL 1 DAYS AND spam = 0 AND duplicate = 0 AND ignore = 0 GROUP BY d.dt ORDER BY d.dt
このクエリは、データのない日付を含む日付の完全なセットを返し、ギャップをゼロで埋めます。
以上がMySQL クエリの日付のギャップを埋めるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。