РЕДАКТИРОВАТЬ : чтобы уточнить, есть много пользователей и у каждого пользователя много записей, это таблица журнала действий пользователей,

Как найти разницу отметок времени для каждой записи и последующей записи, удовлетворяющей некоторому условию,

Например, если таблица выглядит примерно так

| id |u_id| .. | timestamp          | 
|----|----|----|--------------------|
| 50 | 1  | .. | 2014-04-22 15:35:44|
| 90 | 2  | .. | 2014-04-22 13:35:44|
| .. | .. | .. | .....              |

Как мне найти разницу во времени между каждой записью и следующей записью только для одного идентификатора пользователя?

-1
Manquer 2 Май 2014 в 14:56

3 ответа

Лучший ответ

Предполагая, что вы хотите сделать это для всех пользователей, самый простой способ - использовать переменные:

select t.*,
       if(u_id = @u_id, timediff(`timestamp`, @timestamp), NULL) as diff,
       @timestamp := `timestamp`, @u_id := u_id
from table t cross join
     (select @timestamp := 0, @u_id := 0) var
order by u_id, timestamp;

Важно явно упорядочить записи, чтобы гарантировать, что обработка происходит в последовательном порядке.

4
Gordon Linoff 2 Май 2014 в 11:07

Пытаться

select timediff(`timestamp`, @lasttime),
       @lasttime := `timestamp`
from your_table
cross join (select @lasttime := 0) d
where u_id = 1
order by id
2
juergen d 2 Май 2014 в 11:53

Есть несколько способов сделать это, первый - использовать коррелированный подзапрос:

SELECT  T.id,
        T.u_id,
        timestamp,
        (   SELECT  T2.timestamp
            FROM    T AS T2
            WHERE   T2.u_id = T.u_id
            AND     T2.timestamp > T.timestamp
            ORDER BY T2.Timestamp
            LIMIT 1
        ) AS NextTimeStamp
FROM    T;

Или вы можете сделать это с помощью JOIN.

SELECT  T.id,
        T.u_id,
        T.timestamp,
        T2.timestamp AS NextTimeStamp
FROM    T
        LEFT JOIN T AS T2
            ON T2.u_id = T.u_id
            AND T2.timestamp > T.timestamp
        LEFT JOIN T AS T3
            ON T3.u_id = T.u_id
            AND T3.timestamp > T.timestamp
            AND T3.timestamp < T2.timestamp
WHERE   T3.id IS NULL;

Какой из них лучше, будет зависеть от ваших реальных требований, количества данных и индексов.

1
GarethD 2 Май 2014 в 11:06