Dies erfordert eine Selbstjagd, wenn Sie es in MySQL tun sollen. Es ist ein Schmerz im Nacken, ein Selbstjoin zu machen, weil MySQL in der Rownum-Funktion keine eingebaute Funktion hat. Aber es ist immer noch machbar.
Zunächst müssen wir eine Unterabfrage erstellen, um eine virtuelle Tabelle zu erstellen, die simuliert ist SELECT rownum, user, timestamp FROM login
was wir tun können. http://sqlfiddle.com/#!2/bf6ef/2/0
SELECT @a:=@a+1 AS rownum, user, timestamp
FROM (
SELECT user, timestamp
FROM login
ORDER BY timestamp
) C,
(SELECT @a:=0) s
Als nächstes müssen wir ein Selbstjagd dieser virtuellen Tabelle zu einer Kopie von sich selbst machen. Was wir in diesem Ergebnissatz wollen, ist eine Liste aller aufeinanderfolgenden Zeilenpaare in der Tabelle. Diese Abfrage ist ein Haarball - sie bringt die strukturiert in Strukturierte Abfragesprache. Aber es funktioniert. Hier ist es: http://sqlfiddle.com/#!2/bf6ef/4/0
SELECT first.user AS fuser,
first.timestamp AS ftimestamp,
second.user AS suser,
second.timestamp as stimestamp,
TIMESTAMPDIFF(SECOND, first.timestamp, second.timestamp) AS timeloggedin
FROM (
SELECT @a:=@a+1 AS rownum, user, timestamp
FROM (
SELECT user, timestamp
FROM login
ORDER BY timestamp
) C,
(SELECT @a:=0) s
) AS first
JOIN (
SELECT @b:=@b+1 AS rownum, user, timestamp
FROM (
SELECT user, timestamp
FROM login
ORDER BY timestamp
) C,
(SELECT @b:=0) s
) AS second ON first.rownum+1 = second.rownum
Der ganze Trick für den Vergleich aufeinanderfolgender Zeilen ist die
SELECT (virtual_table) AS first
JOIN (virtual_table) AS second ON first.rownum+1 = second.rownum
Abfragemuster. Das Rownum+1 = Rownum -Ding versammelt Zeilen miteinander aufeinanderfolgenden Zahlen.
Als nächstes müssen wir das Ergebnis dieser Abfrage zusammenfassen, um die Gesamtzeit für jeden Benutzer angemeldet zu werden. Das wird so funktionieren:
SELECT user, SUM(timeloggedin) AS timeloggedin
FROM (
/* the self-joined query */
) AS selfjoin
GROUP BY user
ORDER BY user
Das sieht so aus: http://sqlfiddle.com/#!2/bf6ef/5/0
Dies ist die ganze Abfrage zusammen.
SELECT user, SUM(timeloggedin) AS timeloggedin
FROM (
SELECT first.user AS user,
TIMESTAMPDIFF(SECOND, first.timestamp, second.timestamp) AS timeloggedin
FROM (
SELECT @a:=@a+1 AS rownum, user, timestamp
FROM (
SELECT user, timestamp
FROM login
ORDER BY timestamp
) C,
(SELECT @a:=0) s
) AS first
JOIN (
SELECT @b:=@b+1 AS rownum, user, timestamp
FROM (
SELECT user, timestamp
FROM login
ORDER BY timestamp
) C,
(SELECT @b:=0) s
) AS second ON first.rownum+1 = second.rownum
) AS selfjoin
GROUP BY user
ORDER BY user
Es ist nicht wirklich intuitiv für jemanden, der an prozedurale, algorithmische und nachdenkliche Nachdenken gewöhnt ist. So machen Sie diese Art von Vergleich von aufeinanderfolgender Reihenfolge in SQL.