2013-07-07 35 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 

這將運行在大型數據集的速度非常緩慢。