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에서 이런 종류의 연속 열 비교를하는 방식입니다.