これには、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のものは、連続した行番号が一緒に列を収集します。
次に、各ユーザーの合計時間をログインするために、そのクエリの結果を要約する必要があります。それは次のように機能します:
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でこの種の連続した列比較を行う方法です。