mysql - 如何根据最小绝对时间差编写查询以连接两个表?
问题描述
我需要帮助编写一个 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;
解决方案
如果你只想要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;
推荐阅读
- python - 将 3 维数组从 R 保存为 Python numpy 读取的格式
- java - 杰克逊序列化继承和方法重载问题
- java - 如何在 Project Jigsaw 中合并两个导出相同包的自动模块?
- r - 单击时刷新图像(单击时播放动画 - 闪亮)
- python - 初始化 kivy 屏幕时遇到困难,TypeError: __init__() 需要 1 个位置参数,但给出了 2 个
- pagerduty - 节流 Pagerduty 警报
- xml - 从最低成员中获取所有祖先的共同 id
- ssl - 具有真正动态后端的 HAProxy
- c++ - C++ 许多 SFINAE 风格的重载
- dart - 在 Dart 中编写计算