我有一个包含时间戳和类型(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事件运行一个新查询,我知道该怎么做,但是一旦表变成数千行,这显然会非常慢。
答案 0 :(得分:1)
正如您所建议的,对每行执行此查询效率不高。但是,JOIN
似乎很适合您的需求:
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
答案 1 :(得分:1)
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