首页 > 解决方案 > 如何根据最小绝对时间差编写查询以连接两个表?

问题描述

我需要帮助编写一个 MySQL 查询来匹配下表。到目前为止,我的查询如下所示:

SELECT event.id, event.eventid, upload.uploadid
FROM event
LEFT JOIN upload
ON(event.id = upload.id and event.timestamp <= upload.timestamp);

我的连接中的第二个条件event.timestamp <= upload.timestamp, 是一个占位符,直到我可以找出一个布尔表达式(或其他东西)来获得所需的结果。我不知道如何根据最小绝对时间差编写加入声明。这些表具有以下结构:

事件表

ID 事件标识 时间戳
u1 事件1 2020-01-01 01:30:00
u1 事件2 2020-01-01 01:45:00
u2 事件1 2020-01-01 05:30:00
u2 事件2 2020-01-01 05:39:00

上传表格

ID 上传id 时间戳
u1 上传1 2020-01-01 01:30:00
u1 上传2 2020-01-01 02:30:00
u2 上传1 2020-01-01 05:30:00
u2 上传2 2020-01-01 05:35:00

查询需要将事件表中的每个事件与来自该相应用户的最近上传相匹配。

查询的期望结果是:

u1 event1 upload1
u1 event2 upload1
u2 event1 upload1
u2 event2 upload2

编辑:以下查询产生了所需的结果:

SELECT e.id, e.eventid, 
        (SELECT u.uploadid
        FROM upload u
        WHERE (u.id = e.id and u.timestamp < e.timestamp)
        ORDER BY ABS(TIMESTAMPDIFF(second, u.timestamp, e.timestamp))
        LIMIT 1) 
FROM event e;

标签: mysqlsql

解决方案


如果你只想要uploadid,那么我会建议一个相关的子查询:

SELECT e.*,
       (SELECT u.uploadid
        FROM upload u
        WHERE u.id = e.id
        ORDER BY ABS(TIMESTAMPDIFF(second, e.timestamp, u.timestamp))
       ) as uploadid
FROM event e;

推荐阅读