Это требует самостоятельного положения, если вы хотите сделать это в MySQL. Это боль в шее, чтобы сделать самообучение, потому что MySQL не имеет встроенной функции Rownum. Но это все еще выполнимо.
Во -первых, нам нужно создать подзадачу, чтобы создать виртуальную таблицу, имитирующую SELECT rownum, user, timestamp FROM login
Что мы можем сделать так. 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
Далее нам нужно сделать самостоятельный уряд этой виртуальной таблицы в копию себя. Что мы хотим в этом наборе результатов, так это список всех последовательных пар строк в таблице. Этот запрос - волос - он ставит структурированный в Структурированный язык запросов. Анкет Но это работает. Вот: 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
Весь трюк для сравнения последовательных рядов - это
SELECT (virtual_table) AS first
JOIN (virtual_table) AS second ON first.rownum+1 = second.rownum
Запрос шаблон. Rownum+1 = Rownum Thing собирает ряды с последовательными номерами строк вместе.
Затем нам необходимо подвести итог результата этого запроса, чтобы получить общее время, вошли в систему для каждого пользователя. Это будет работать так:
SELECT user, SUM(timeloggedin) AS timeloggedin
FROM (
/* the self-joined query */
) AS selfjoin
GROUP BY user
ORDER BY user
Это выглядит так: http://sqlfiddle.com/#!2/bf6ef/5/0
Это весь запрос, собранный.
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
Это не реально для кого -то, привыкшего к процедурной, алгоритмической, мышлению. Но именно так вы делаете этот вид последовательного сравнения в SQL.