MySQL の日付ギャップを埋める
問題:
特定の日付の集計データを抽出するには、MySQL クエリが使用されます。ただし、返される結果セットにはデータのある日付のみが含まれ、日付の間にはデータのないギャップが残ります。目標は、これらのギャップをゼロで埋めて、連続した日付範囲を作成することです。
解決策:
これを実現するには、ヘルパー テーブルが必要です。このテーブルには、希望の開始日から希望の終了日までのすべての日付が含まれます。
CREATE TABLE dates ( dt DATE NOT NULL, PRIMARY KEY (dt) );
ヘルパー テーブルは、クエリを使用して設定できます:
INSERT INTO dates (dt) SELECT DATE(posted_at) FROM messages WHERE brand_id = 1 AND spam = 0 AND duplicate = 0 AND ignore = 0 GROUP BY DATE(posted_at) UNION SELECT DATE('2023-01-01') + INTERVAL i-1 DAY FROM ( SELECT 1 AS i UNION ALL SELECT i + 1 FROM <table> WHERE i < DATEDIFF('2023-12-31', '2023-01-01') ) AS i;
Replace '2023-01 -01」と「2023-12-31」に希望の開始日と終了日を入力します。
次に、ヘルパー テーブルは、元のクエリで 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 サイトの他の関連記事を参照してください。