Ich bin kein Fan der anderen Antworten, da Tabellen erstellt werden müssen und so weiter. Diese Abfrage erledigt dies effizient ohne Hilfstabellen.
SELECT
IF(score IS NULL, 0, score) AS score,
b.Days AS date
FROM
(SELECT a.Days
FROM (
SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Days
FROM (SELECT 0 AS a 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) AS a
CROSS JOIN (SELECT 0 AS a 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) AS b
CROSS JOIN (SELECT 0 AS a 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) AS c
) a
WHERE a.Days >= curdate() - INTERVAL 30 DAY) b
LEFT JOIN your_table
ON date = b.Days
ORDER BY b.Days;
Also lasst uns das analysieren.
SELECT
IF(score IS NULL, 0, score) AS score,
b.Days AS date
Das if erkennt Tage ohne Punktzahl und setzt sie auf 0. b.Days ist die konfigurierte Anzahl von Tagen, die Sie ab dem aktuellen Datum ausgewählt haben, bis zu 1000.
(SELECT a.Days
FROM (
SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Days
FROM (SELECT 0 AS a 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) AS a
CROSS JOIN (SELECT 0 AS a 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) AS b
CROSS JOIN (SELECT 0 AS a 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) AS c
) a
WHERE a.Days >= curdate() - INTERVAL 30 DAY) b
Diese Unterabfrage habe ich beim Stackoverflow gesehen. Ab dem aktuellen Datum wird effizient eine Liste der letzten 1000 Tage erstellt. Das Intervall (derzeit 30) in der WHERE-Klausel am Ende bestimmt, welche Tage zurückgegeben werden. Das Maximum ist 1000. Diese Abfrage kann leicht geändert werden, um Daten im Wert von 100 Jahren zurückzugeben, aber 1000 sollte für die meisten Dinge gut sein.
LEFT JOIN your_table
ON date = b.Days
ORDER BY b.Days;
Dies ist der Teil, der Ihre Tabelle mit der Partitur enthält. Sie vergleichen mit dem ausgewählten Datumsbereich aus der Datumsgeneratorabfrage, um bei Bedarf Nullen eingeben zu können (die Punktzahl wird NULL
anfänglich auf gesetzt, da es sich um eine handelt LEFT JOIN
; dies ist in der select-Anweisung festgelegt). Ich bestelle es auch nach Datum, nur weil. Dies ist eine Präferenz, Sie können auch nach Punktzahl bestellen.
Vorher ORDER BY
konnten Sie sich leicht mit Ihrer Tabelle über Benutzerinformationen verbinden, die Sie bei Ihrer Bearbeitung erwähnt haben, um diese letzte Anforderung hinzuzufügen.
Ich hoffe, diese Version der Abfrage hilft jemandem. Danke fürs Lesen.