In einer MySQL-DB-Tabelle, die Verkaufsaufträge speichert, ich habe eine LastReviewed
Spalte, die das letzte Datum und Zeit hält, wenn der Verkauf modifiziert wurde (Typ timestamp
, Standardwert CURRENT_TIMESTAMP
). Ich möchte die Anzahl der Verkäufe grafisch darstellen, die jeden Tag in den letzten 90 Tagen für einen bestimmten Benutzer geändert wurden.SQL: Reuse Funktion Ergebnis in Abfrage ohne Verwendung von Unter Abfrage
Ich versuche, eine SELECT
zu erstellen, die die Anzahl der Tage seit LastReviewed
Datum zurückgibt, und wie viele Datensätze in diesem Bereich fallen. Im Folgenden finden Sie meine Frage, die ganz gut funktioniert:
SELECT DATEDIFF(CURDATE(), LastReviewed) AS days, COUNT(*) AS number FROM sales
WHERE UserID=123 AND DATEDIFF(CURDATE(),LastReviewed)<=90
GROUP BY days
ORDER BY days ASC
Beachten Sie, dass ich für jeden Datensatz die DATEDIFF()
sowie CURDATE()
mehrere Male am Berechnung. Dies scheint wirklich ineffektiv zu sein, daher würde ich gerne wissen, wie ich die Ergebnisse der vorherigen Berechnung wiederverwenden kann. Das erste, was ich versuchte, war:
SELECT DATEDIFF(CURDATE(), LastReviewed) AS days, COUNT(*) AS number FROM sales
WHERE UserID=123 AND days<=90
GROUP BY days
ORDER BY days ASC
Fehler: Unknown column 'days' in 'where clause'
. Also fing ich an, mich im Internet umzusehen. Basierend auf einer andere Diskussion (Can I reuse a calculated field in a SELECT query?) habe ich versucht, neben den folgenden:
SELECT DATEDIFF(CURDATE(), LastReviewed) AS days, COUNT(*) AS number FROM sales
WHERE UserID=123 AND (SELECT days)<=90
GROUP BY days
ORDER BY days ASC
Fehler: Unknown column 'days' in 'field list'
. Ich habe auch versucht, die folgenden:
SELECT @days := DATEDIFF(CURDATE(), LastReviewed) AS days,
COUNT(*) AS number FROM sales
WHERE UserID=123 AND @days <=90
GROUP BY days
ORDER BY days ASC
Die Abfrage gibt Null-Ergebnis, so @days<=90
scheint false
sogar zurück, obwohl, wenn ich es in der SELECT
Klausel setzen und entfernen Sie die WHERE
Klausel, ich einige Ergebnisse mit @days
sehen Werte unter 90
ich habe Dinge bekommen, indem sie eine Unterabfrage zu arbeiten:
SELECT * FROM (
SELECT DATEDIFF(CURDATE(),LastReviewed) AS sales ,
COUNT(*) AS number FROM sales
WHERE UserID=123
GROUP BY days
) AS t
WHERE days<=90
ORDER BY days ASC
ich odn't jedoch wissen, ob es der effizienteste Weg ist. Ganz zu schweigen davon, dass selbst diese Lösung CURDATE()
einmal pro Datensatz berechnet, obwohl ihr Wert vom Anfang bis zum Ende der Abfrage gleich ist. Ist das nicht verschwenderisch? Übertreibe ich das? Hilfe wäre willkommen.
Hinweis: Mods, sollte dies auf CodeReview sein? Ich habe hier gepostet, weil der Code, den ich versuche zu verwenden, nicht wirklich funktioniert
FWIW, Ihre Query + Unterabfrage ist nicht _expensiv_ und Sie können überprüfen, ob 'WHERE Tage <90' in der Query ODER' DATEDIFF (CURDATE(), LastReviewed) 'Ergebnisse schneller gibt. – aneroid
Ich habe es in meinem Beitrag nicht erwähnt (ich füge es in einer Minute hinzu), aber eine andere Sache, die mich nervt, ist, dass ich 'CURDATE()' bei jedem Schritt berechne, obwohl es sich nicht von Anfang an ändert das Ende der Abfrage – BeetleJuice