2013-07-07 2 views
1

Я получил структуру таблицы следующим образом:Mysql: Найти строки, где разница метка времени меньше, чем х

Field  Type 
id    int(11)  AI 
user   varchar(64) 
date   timestamp 
key    int(11) 

Что мне нужно сделать, это найти строки (с данного дня), где разница между двумя последовательные ряды (ближайшая метка времени (для данного пользователя) меньше, чем 1300.

мне сказали, чтобы использовать запрос, как это:.

select t.* 
from (select t.*, @nextdate as nextdate, @nextdate := date 
     from my_table t 
     order by date desc 
    ) t 
where t.nextdate - t.date < 1300; 

Но это не похоже на работу Может кто-нибудь помочь мне решить моя задача?

+0

Возможный дубликат [Сравнение данных по datetime MySQL с предыдущей строкой] (http://stackoverflow.com/questions/10079190/mysql-datetime-comparison-with-previous-row) – bansi

+0

попробуйте использовать «заказ по пользователю, дата desc' – chetan

ответ

1

попробовать это: -

select t1.user, t1.date d1,t2.date d2 ,t1.date-t2.date 
    from (select @val:[email protected]+1 rowid,user, date 
      from mytable,(select @val:=0) a 
     order by user,date) t1, 

     (select @val1:[email protected]+1 rowid,user, date 
      from mytable,(select @val1:=1) b 
     order by user,date) t2 

where t1.rowid = t2.rowid 
    and t1.user = t2.user 
    and t1.date-t2.date < 1300; 

см DEMO

+0

работает как шарм! Спасибо большое! – PsychoX

+0

добро пожаловать – chetan

+1

Конечно :) Извините :) – PsychoX

1

DATEDIFF (t.netxdata, t.date) < (1300/3600/24) Я принимал 1300 секунд за несколько секунд, поэтому я конвертировал его в дни, которые возвращает DATEDIFF. Обратите внимание: этот запрос будет выполнять полное сканирование таблицы, что может быть дорогостоящим.

+0

Хмм ... В Phpmyadmin У меня есть информация, что запрос был успешным, но я не вижу никаких возвратных буксиров. Нет информации о том, сколько строк было возвращено. – PsychoX

1

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

Однако, если производительность не является фактором, вы могли бы сделать коррелированный подзапрос, как показано на следующем

SELECT *, second_time - first_time 
    FROM 
    (
     SELECT T.user, 
      T.date  AS first_time, 
      (SELECT MIN(S.date) 
       FROM My_Table S 
       WHERE S.user = T.user 
        AND S.date > T.date 
      )       AS second_time 
     FROM My_Table T 
    ) G 
    WHERE (second_time - first_time) < 1300 

это будет работать очень медленно на больших наборах данных.

Смежные вопросы