mysql - 如何在没有子查询的情况下获取每行日期字段与最近的前一个日期行的 TIMEDIFF?

标签 mysql sql

我需要计算一行与字段 dateCompleted 是该行之前最后一个字段的行之间的 TIMEDIFF,然后获取值 timeSinceLast

我可以通过子查询轻松完成此操作,但速度非常慢。 (比直接查询表中的行慢大约 12-15 倍)。

#Very slow
Select a.*, TIMDIFF(a.dateCompleted, (SELECT a2.dateCompleted FROM action a2 WHERE a2.dateCompleted < a.dateCompleted ORDER BY a2.dateCompleted DESC LIMIT 1)) as timeSinceLast
FROM action a;

我尝试将其作为与自身的联接来执行,但无法弄清楚如何实现该工作,因为我不知道如何在联接表而不是查询上执行 LIMIT 1作为一个整体。

#How limit the join table only?
SELECT a.*, TIMEDIFF(a.dateCompleted, a2.dateCompleted)
FROM action a
LEFT JOIN action a2 on a2.dateCompleted < a.dateCompleted 
LIMIT 1;

这在 MySQL 中可能吗?

编辑:架构和数据

http://sqlfiddle.com/#!9/03b5c/3

create table Actions
( 
   id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   dateCompleted datetime not null
);


#Notice, they can come out of order.
#   The third one would affect the first one in my query as
#   it's the first completed date right after the first

insert into Actions (dateCompleted)
values ("2016-05-06 12:11:01");

insert into Actions (dateCompleted)
values ("2016-05-06 12:11:03");

insert into Actions (dateCompleted)
values ("2016-05-06 12:11:02");

insert into Actions (dateCompleted)
values ("2016-05-06 12:11:05");

insert into Actions (dateCompleted)
values ("2016-05-06 12:11:04");

结果(按完成日期排序):

id  dateCompleted          timeSinceLast
 1, "2016-05-06 12:11:01", null
 3, "2016-05-06 12:11:02", 1
 2, "2016-05-06 12:11:03", 1
 5, "2016-05-06 12:11:04", 1
 4, "2016-05-06 12:11:05", 1

(在这个简单的例子中,他们自下一次以来都有一个第二次)

最佳答案

SELECT x.*
     , MIN(TIMEDIFF(x.datecompleted,y.datecompleted)) 
  FROM actions x 
  LEFT 
  JOIN actions y 
    ON y.datecompleted < x.datecompleted 
 GROUP 
    BY x.id 
 ORDER 
    BY x.datecompleted;

...或者更快...

SELECT x.*
     , TIMEDIFF(datecompleted,@prev)
     , @prev:=datecompleted 
  FROM actions x
     , (SELECT @prev:=null) vars 
 ORDER 
    BY datecompleted;

关于mysql - 如何在没有子查询的情况下获取每行日期字段与最近的前一个日期行的 TIMEDIFF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37104817/

相关文章:

sql - 简单的选择技巧

php - MySQL DAYNAME 明智地检索不同时区的数据

php - 当 left join 返回 null 时,'where' 条件失败

MYSQL插入成功但没有添加数据

php - SELECT * 会比 40 列列表更快吗?

mysql - COUNT(*) 为 0 时不包含在结果中并且连接时遇到问题

sql - 在 Oracle SQL 中什么时候需要使用分号和斜线?

php - mongodb 在使用 php 时出错

sql - 如何在 where 子句中获取多个条件

java - 找不到连接数据库的错误