I mit der Struktur eine MySQL Tabelle haben:für eine maximale Länge von aufeinanderfolgenden Tagen überprüft, die spezifische Bedingung erfüllen
beverages_log (id, users_id, beverages_id, Zeitstempel)
Ich versuche, die maximale Strähne zu berechnen an aufeinanderfolgenden Tagen, an denen ein Benutzer (mit der ID 1) mindestens fünfmal täglich ein Getränk (mit der ID 1) anmeldet. Ich bin mir ziemlich sicher, dass diese Ansichten getan werden kann, wie folgt verwendet:
CREATE or REPLACE VIEW daycounts AS
SELECT count(*) AS n, DATE(timestamp) AS d FROM beverages_log
WHERE users_id = '1' AND beverages_id = 1 GROUP BY d;
CREATE or REPLACE VIEW t AS SELECT * FROM daycounts WHERE n >= 5;
SELECT MAX(streak) AS current FROM (SELECT DATEDIFF(MIN(c.d), a.d)+1 AS streak
FROM t AS a LEFT JOIN t AS b ON a.d = ADDDATE(b.d,1)
LEFT JOIN t AS c ON a.d <= c.d
LEFT JOIN t AS d ON c.d = ADDDATE(d.d,-1)
WHERE b.d IS NULL AND c.d IS NOT NULL AND d.d IS NULL GROUP BY a.d) allstreaks;
jedoch wiederholt Erstellen von Ansichten für verschiedene Benutzer jedes Mal, wenn ich diese Prüfung laufe ziemlich ineffizient scheint. Gibt es eine Möglichkeit in MySQL, diese Berechnung in einer einzigen Abfrage durchzuführen, ohne Ansichten zu erstellen oder die gleichen Unterabfragen mehrmals aufzurufen?
Ja, das funktioniert gut - danke! Ich bin mir nicht sicher, ob ich den "INNER JOIN (SELECT @prev: = NULL, @c: = 1) AS vars" vollständig verstehe - sollen die Variablen nur gelöscht werden? –
Es ist nur sicherzustellen, dass sie keine Werte aus einer vorherigen Ausführung der Abfrage haben. – nnichols
Gefallen. Noch eine Frage - wie kommt es, dass @prev sich tatsächlich auf das Datum für die vorherige Zeile bezieht? Es scheint, dass, wenn es als "@prev: = t.d" definiert ist, es nur das Datum für die aktuelle Zeile angibt. –