我需要从一个非常大的表中获取按日期时间排序的ID列表 几百万行。 这个选择几乎立即得到一个结果(大约300行的结果)。
SELECT t.ID,t.Datetime from table t where (...) ORDER BY t.Datetime
作为额外字段,我还需要“日期时间”字段的时差 这一行和前一行。我想识别时差很大的行。
我尝试自己加入桌子。这些连接的性能非常好 坏。仅比较搜索结果中的行的最佳方法是什么?
答案 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;