Esto requiere un auto unirse si quieres hacerlo en MySQL. Es un dolor en el cuello hacer un un unión porque MySQL no tiene una función de Rownum incorporada. Pero todavía es factible.
Primero, necesitamos crear una subconsulta para crear una tabla virtual simulando SELECT rownum, user, timestamp FROM login
que podemos hacer así. 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
A continuación, necesitamos hacer una unión de esta tabla virtual a una copia de sí misma. Lo que queremos en este conjunto de resultados es una lista de todos los pares consecutivos de filas en la tabla. Esa consulta es una bola de pelo, pone la estructurado en lenguaje de consulta estructurado. Pero funciona. Aquí está: 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
Todo el truco para comparar filas consecutivas es la
SELECT (virtual_table) AS first
JOIN (virtual_table) AS second ON first.rownum+1 = second.rownum
Patrón de consulta. La cosa de Rownum+1 = Rownum reúne filas con números de fila consecutivos juntas.
A continuación, debemos resumir el resultado de esa consulta para que el tiempo total inicie sesión para cada usuario. Eso funcionará así:
SELECT user, SUM(timeloggedin) AS timeloggedin
FROM (
/* the self-joined query */
) AS selfjoin
GROUP BY user
ORDER BY user
Eso se ve así: http://sqlfiddle.com/#!2/bf6ef/5/0
Esta es toda la consulta junta.
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
No es realmente intuitivo para alguien acostumbrado al pensamiento de procedimiento, algorítmico,. Pero esta es la forma en que haces este tipo de comparación de filas consecutivas en SQL.