Heim >Datenbank >MySQL-Tutorial >Wie rufe ich alle Daten innerhalb eines bestimmten Bereichs in MySQL ab, einschließlich Daten ohne Datensätze?

Wie rufe ich alle Daten innerhalb eines bestimmten Bereichs in MySQL ab, einschließlich Daten ohne Datensätze?

Linda Hamilton
Linda HamiltonOriginal
2024-12-13 18:39:10636Durchsuche

How to Retrieve All Dates Within a Specified Range in MySQL, Including Dates with No Records?

MySQL: Alle Daten innerhalb eines bestimmten Zeitraums abrufen, auch 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:

  • Anpassen die Werte „2011-01-02 00:00:00.000“ und NOW(), um den gewünschten Beginn und das Ende des Datums anzugeben Bereich.
  • Wenn Datensätze außerhalb des in der Abfrage angegebenen Datumsbereichs vorhanden sind, werden sie dennoch in die Ergebnisse einbezogen.
  • Diese Lösung ist nicht von der Tabellenstruktur oder dem Vorhandensein von Datensätzen abhängig in der Benutzertabelle. Es generiert eine umfassende Datumsfolge innerhalb des angegebenen Bereichs und verknüpft die Ergebnisse mit den Daten aus der Tabelle, falls vorhanden.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn