我有一张表
id, datetime
1 2014-01-01 01:23:23
2 2014-01-01 01:25:23
3 2014-01-01 01:26:23
4 2014-01-01 01:26:25
7 2014-01-01 01:27:25
8 2014-01-01 01:27:26
我希望收到一份ID列表,他们之间的差异超过60秒。
我的表非常大,当我尝试运行查询时需要很长时间。有没有更简单的方法?表中的ID不是自动增量,它们可以在它们之间跳转。
SELECT A.id, A.datetime, (B.datetime - A.datetime) AS timedifference
FROM MyTable A CROSS JOIN MyTable B
WHERE B.id IN (SELECT MIN(C.id) FROM MyTable C WHERE C.id > A.id
AND C.datetime between '2014-08-10 00:00:00' AND '2014-08-10 00:01:00')
AND A.datetime between '2014-08-10 00:00:00' AND '2014-08-10 00:01:00'
AND B.datetime between '2014-08-10 00:00:00' AND '2014-08-10 00:01:00'
having timedifference > 60
ORDER BY A.id ASC;
答案 0 :(得分:2)
如果我理解正确,你只想找到一分钟或更长的差距。我会建议一个相关的子查询:
select a.id, a.datetime,
(select id
from mytable b
where b.datetime > a.datetime + interval 1 minute
order by b.datetime
limit 1
) as nextid
from mytable a
where A.datetime between '2014-08-10 00:00:00' AND '2014-08-10 00:01:00'
having nextid is not null;
为了提高性能,您需要mytable(datetime, id)
上的索引。
答案 1 :(得分:0)
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,datetime DATETIME NOT NULL
);
INSERT INTO my_table VALUES
(1,'2014-01-01 01:23:23'),
(2,'2014-01-01 01:25:23'),
(3,'2014-01-01 01:26:23'),
(4,'2014-01-01 01:26:25'),
(7,'2014-01-01 01:27:25'),
(8,'2014-01-01 01:27:26');
SELECT a.id
, TIMEDIFF(b.datetime,a.datetime)
FROM (SELECT x.*, @i:=@i+1 rank FROM my_table x, (SELECT @i:=0) i ORDER BY x.id) a
JOIN (SELECT x.*, @j:=@j+1 rank FROM my_table x, (SELECT @j:=0) j ORDER BY x.id) b
ON b.rank = a.rank + 1
AND b.datetime > a.datetime + INTERVAL 60 SECOND;
+----+---------------------------------+
| id | TIMEDIFF(b.datetime,a.datetime) |
+----+---------------------------------+
| 1 | 00:02:00 |
+----+---------------------------------+