Heim >Datenbank >MySQL-Tutorial >Wie füllt man Datumslücken in MySQL-Abfragen?
Datumslücken in MySQL füllen
Bei der Arbeit mit datumsbasierten Abfragen in MySQL kann es vorkommen, dass es Lücken in den Daten gibt für bestimmte Termine. Dies kann problematisch sein, wenn Sie eine umfassende Ansicht der Daten präsentieren oder Berechnungen durchführen möchten, die auf einem vollständigen Satz von Daten basieren.
Abfrage mit Datumslücken:
Um das Problem zu veranschaulichen, betrachten Sie die folgende Abfrage:
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
Diese Abfrage gibt die nach Datum gruppierten Ergebnisse zurück und zeigt die Gesamtzahl und Einstellungssummen für jedes Datum an. Wenn es jedoch Daten ohne Daten gibt, werden diese nicht in die Ergebnisse einbezogen, was zu Lücken im Datensatz führt.
Lücken füllen:
Zum Füllen Wenn wir diese Lücken mit Nullen versehen, können wir eine Hilfstabelle verwenden, um einen vollständigen Satz von Datumsangaben zwischen einem Start- und einem Enddatum zu generieren. Die Hilfstabelle kann mit der folgenden Abfrage erstellt werden:
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
Diese Abfrage fügt rekursiv einen Tag zum aktuellen Datum hinzu, bis es ein Jahr in der Zukunft erreicht.
Abfrage mit Hilfstabelle:
Jetzt können wir die Hilfstabelle mit unserer Hauptabfrage verknüpfen, indem wir einen LEFT JOIN verwenden, um das Datum zu füllen Lücken:
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
Diese Abfrage gibt einen vollständigen Satz von Datumsangaben zurück, einschließlich derjenigen ohne Daten, und füllt die Lücken mit Nullen.
Das obige ist der detaillierte Inhalt vonWie füllt man Datumslücken in MySQL-Abfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!