MySql - 选择select语句中前一行的最佳方法来比较时差?

时间:2015-01-05 00:53:03

标签: mysql performance datetime

我需要从一个非常大的表中获取按日期时间排序的ID列表 几百万行。 这个选择几乎立即得到一个结果(大约300行的结果)。

SELECT t.ID,t.Datetime from table t where (...) ORDER BY t.Datetime

作为额外字段,我还需要“日期时间”字段的时差 这一行和前一行。我想识别时差很大的行。

我尝试自己加入桌子。这些连接的性能非常好 坏。仅比较搜索结果中的行的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

在这种情况下,最好的方法是使用变量。以下基本上是您想要的逻辑:

SELECT t.*, @prevdt as prev_datetime, @prevdt := t.DateTime
FROM (SELECT t.ID, t.Datetime
      FROM table t
      WHERE (...)
      ORDER BY t.Datetime
     ) t CROSS JOIN
     (SELECT @prevdt := NULL) vars;

但是,最好将所有变量赋值放在一个语句中(MySQL不保证select中表达式的求值顺序):

SELECT t.*,
       if(@prevdt := @dt, if(@dt := t.DateTime, @prevdt, @prevdt),
          if(@dt := t.DateTime, @prevdt, @prevdt)) as prev_datetime
FROM (SELECT t.ID, t.Datetime
      FROM table t
      WHERE (...)
      ORDER BY t.Datetime
     ) t CROSS JOIN
     (SELECT @prevdt := NULL, @dt := NULL) vars;