Remplir les écarts de dates dans MySQL
Problème :
Pour extraire des données agrégées pour certaines dates , une requête MySQL est utilisée. Cependant, le jeu de résultats renvoyé inclut uniquement les dates contenant des données, ce qui laisse des espaces entre les dates sans données. Le but est de combler ces lacunes avec des zéros pour créer une plage continue de dates.
Solution :
Pour ce faire, une table d'assistance est nécessaire. Ce tableau contiendra toutes les dates depuis la date de début souhaitée jusqu'à la date de fin souhaitée.
CREATE TABLE dates ( dt DATE NOT NULL, PRIMARY KEY (dt) );
La table d'assistance peut être remplie à l'aide d'une requête :
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;
Remplacer '2023-01 -01' et '2023-12-31' avec les dates de début et de fin souhaitées.
Ensuite, la table d'aide est utilisé pour effectuer un LEFT JOIN avec la requête d'origine :
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
Cette requête modifiée renverra l'ensemble de résultats souhaité avec toutes les dates, y compris celles sans données dans la table d'origine, remplies de zéros.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!