2013-07-07 38 views
1

我有表结构如下:MySQL的:查找行,其中时间戳差值小于x

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

[与前一行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

这似乎是一个罕见的情况下,使用游标确实是最合适的,而高性能的选项之一。

然而,如果性能是不是一个考虑因素,你可以做一个相关子查询,如下所示

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 

这将运行在大型数据集的速度非常缓慢。