2017-02-15 82 views
2

嗨所以我有这样一个查询,以便MySQL查询与时间公差

SELECT 
meteor_events.event_id AS event_id, 
meteor_events.user_ID AS user_ID, 
meteor_events.date AS date, 
meteor_events.Time 
from `meteor_events` 

有可能是给定日期的多个事件即

37775 2 2017-01-01 00:01:23 
33500 1 2017-01-01 01:07:56 
37776 2 2017-01-01 01:08:45 
47827 3 2017-01-01 01:08:30 
37777 2 2017-01-03 01:09:44 

我想更新查询,以便它带回一个记录,其中

1 - 日期匹配 和 2 - 时间匹配但有30秒的公差范围

所以在这个例子中,它将返回

37776 2 2017-01-01 01:08:45 
47827 3 2017-01-01 01:08:30 

我只是不知道是开始?

John B

+0

见http://meta.stackoverflow.com/questions/333952/why - 我应该提供一个mcve为什么似乎对我来说是一个非常简单的sql查询 – Strawberry

回答

1

如果将数据和时间列合并为一个,可能会更容易。此外,还要避免使用SQL关键字作为列名

,你需要一个自联接的任务:

SELECT a.event_id, a.user_ID, a.`date`, a.`Time` 
FROM meteor_events AS a 
JOIN meteor_events AS b 
WHERE a.event_id != b.event_id 
AND a.`date` = b.`date` 
AND time_to_sec(a.`Time`) - time_to_sec(b.`Time`) BETWEEN -30 AND 30; 

enter image description here

+0

SIDU工作得很好,它很慢,所以我添加了一个索引日期和时间列,而不是速度不是问题 - 它需要稍微更新。如果用户3例如在+或 - 30秒内具有2个匹配的日期和2次那些结果也被返回,则每个用户事件是唯一的,并且用户3可以具有几个只隔几秒的事件,但它们是独特的事件,I只希望查询从其他用户取回匹配事件 - 希望这有意义吗? –

+0

在这种情况下,添加:AND a.user_ID!= b.user_ID – SIDU

+0

“还避免使用SQL关键字作为列名” - 现在告诉我为什么?我有“'”字符。而且这不会让我的查询时间过长 – ad4s