Heim >Datenbank >MySQL-Tutorial >Wie rufe ich alle Daten innerhalb eines bestimmten Bereichs in MySQL ab, einschließlich Daten ohne Datensätze?
Bei der Arbeit mit Datenbanken ist es häufig erforderlich, Daten für einen bestimmten Zeitraum oder Bereich abzurufen. Wenn jedoch für bestimmte Daten innerhalb dieses Bereichs keine Datensätze vorhanden sind, werden diese Daten möglicherweise in den Ergebnissen übersprungen. Dies kann zu Lücken in der Datenanalyse und -visualisierung führen.
Problem:
In MySQL wählt die folgende Abfrage die Daten und entsprechenden Zählungen aus der Benutzertabelle innerhalb eines bestimmten Zeitraums aus Datumsbereich:
SELECT DATE(datecreated), count(*) AS number FROM users WHERE DATE(datecreated) > '2009-06-21' AND DATE(datecreated) <= DATE(NOW()) GROUP BY DATE(datecreated) ORDER BY datecreated ASC
Diese Abfrage gibt Ergebnisse zurück wie:
date1 5 date2 8 date5 9
Es werden jedoch Datumsangaben übersprungen mit null Benutzern, wodurch Lücken in den Daten entstehen. Die gewünschte Ausgabe wäre:
date1 5 date2 8 date3 0 date4 0 date5 9
Lösung:
Um alle Daten im angegebenen Bereich abzurufen, auch wenn keine zugehörigen Datensätze vorhanden sind, können wir a verwenden ausgefeilte Abfrage, die generierte Datumssequenzen nutzt. Die folgende Abfrage erreicht dies:
select * from ( select date_add('2003-01-01 00:00:00.000', INTERVAL n5.num*10000+n4.num*1000+n3.num*100+n2.num*10+n1.num DAY ) as date from (select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) n1, (select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) n2, (select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) n3, (select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) n4, (select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) n5 ) a where date >'2011-01-02 00:00:00.000' and date < NOW() order by date
Diese Abfrage verwendet verschachtelte UNION ALL-Unterabfragen, um eine Folge von Datumsangaben vom 1. Januar 2003 bis kurz vor dem aktuellen Datum zu generieren. Die Funktion date_add() wird dann verwendet, um die generierten Daten schrittweise zum Startdatum hinzuzufügen, um den gewünschten Datumsbereich zu erstellen.
Zusätzliche Hinweise:
Das obige ist der detaillierte Inhalt vonWie rufe ich alle Daten innerhalb eines bestimmten Bereichs in MySQL ab, einschließlich Daten ohne Datensätze?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!