Ciò richiede un auto-goin se vuoi farlo in MySQL. È un dolore al collo fare un auto-koin perché MySQL non ha una funzione rowum incorporata. Ma è ancora fattibile.
Innanzitutto, dobbiamo creare una sottoquery per creare una tabella virtuale che simula SELECT rownum, user, timestamp FROM login
che possiamo fare così. 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
Successivamente, dobbiamo fare un auto-koin di questa tabella virtuale per una copia di se stessa. Ciò che vogliamo in questo set di risultati è un elenco di tutte le coppie consecutive di righe nella tabella. Quella domanda è una palla di pelo - mette il strutturato in Structured Query Language. Ma funziona. Ecco qui: 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
L'intero trucco per confrontare le righe consecutive è il
SELECT (virtual_table) AS first
JOIN (virtual_table) AS second ON first.rownum+1 = second.rownum
Modello di query. Rownum+1 = Rownum Thing raccoglie le righe con numeri di riga consecutivi insieme.
Successivamente, dobbiamo riassumere il risultato di quella query per ottenere il tempo totale dell'accesso per ciascun utente. Funzionerà in questo modo:
SELECT user, SUM(timeloggedin) AS timeloggedin
FROM (
/* the self-joined query */
) AS selfjoin
GROUP BY user
ORDER BY user
Sembra questo: http://sqlfiddle.com/#!2/bf6ef/5/0
Questa è l'intera query messa insieme.
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
Non è reale intuitivo per qualcuno abituato a pensiero procedurale, algoritmico. Ma questo è il modo in cui fai questo tipo di confronto di fila consecutiva in SQL.