Maison >base de données >tutoriel mysql >Comment combler les écarts de date dans les requêtes agrégées MySQL avec des zéros ?

Comment combler les écarts de date dans les requêtes agrégées MySQL avec des zéros ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-23 06:21:22635parcourir

How to Fill Date Gaps in MySQL Aggregate Queries with Zeroes?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn