0

我有一个带有时间戳和类型(1 或 0)的事件表。我希望选择所有类型 0 行,其中类型 1 行在 10(或其他)秒内具有时间戳。

event_id    |   type    |   timestamp
1           |   0       |   2012-1-1 00:00:00
2           |   0       |   2012-1-1 00:00:01
3           |   1       |   2012-1-1 00:00:09
4           |   1       |   2012-1-1 00:00:10
5           |   0       |   2012-1-1 00:00:14
6           |   0       |   2012-1-1 00:00:20
7           |   1       |   2012-1-1 00:00:25
8           |   0       |   2012-1-1 00:00:40
9           |   0       |   2012-1-1 00:00:50
10          |   1       |   2012-1-1 00:01:00

所以在这个例子中,它将抓取第 1,2 和 6 行

如果我为每个类型 0 事件运行一个新查询,我知道该怎么做,但显然,一旦表变成数千行,这可能会非常慢。

4

2 回答 2

1

正如您所建议的,对每一行执行此查询效率低下。但是, aJOIN似乎很适合您的需要:

SELECT ones.*
FROM   my_table ones
JOIN   my_table zeroes 
ON     zeroes.type = 0 AND 
       TIME_TO_SEC(TIMEDIFF(ones.timestamp, zeroes.timestamp)) <= 10
WHERE  ones.type = 1
于 2013-11-13T06:01:13.233 回答
1

SQLFiddle 演示

select distinct t1.* from t as t1
JOIN t as t2 on (t2.type=1) and 
                (t2.timestamp between t1.timestamp
                                  AND t1.timestamp + INTERVAL 10 SECOND
                 ) 
where t1.type=0
于 2013-11-13T06:04:16.993 回答