mysql-开始和结束之间的时间的SQL Join表
作者:互联网
我有两个表:
Events (ID, Name, Time, Recorder)
Video (ID, StartTime, EndTime, Recorder, Filename)
我希望将事件数据添加到视频数据中,以便为每个事件获取视频文件名.记录器字段用于指定在事件发生时可操作的记录器,并协助多个记录器同时记录视频.
如果我不关心没有视频的事件,那很好(我可以获取SQL),但是在我的情况下,我希望显示最接近的视频文件名和秒数差异.
编辑
样本数据
大事记
1, EV1, 2012-01-01 12:00, A
2, EV2, 2012-01-01 13:00, B
3, EV3, 2012-01-01 12:15, B
4, EV4, 2012-01-01 11:45, A
视频
1, 2012-01-01 12:00, 2012-01-01 12:30, A, 1.mpg
2, 2012-01-01 13:00, 2012-01-01 13:30, A, 2.mpg
3, 2012-01-01 12:00, 2012-01-01 12:30, B, 3.mpg
结果
(EventID,VideoID,文件名,IsBetween,secondsDifference)
1, 1, 1.mpg, TRUE, 0
2, 3, 3.mpg, FALSE, 1800 //1800 seconds from the end of video 3
3, 3, 3.mpg, TRUE, 900
4, 1, 1.mpg, FALSE, 900 //900 seconds from the start of video 1
奖金
如果最近的视频没有考虑到录像机,我会更好(但是要考虑到第一个界限(开始和结束)),如果这太困难了,那就可以了.
解决方法:
这有点笨拙,但这是我想出的:
SELECT
*
FROM
(
SELECT
a.ID AS EventID,
b.ID AS VideoID,
b.Filename,
(
CASE
WHEN a.Time < b.StartTime THEN UNIX_TIMESTAMP(b.StartTime) - UNIX_TIMESTAMP(a.Time)
WHEN a.Time > b.EndTime THEN UNIX_TIMESTAMP(a.Time) - UNIX_TIMESTAMP(b.EndTime)
END
) AS distance_factor
FROM
`Events` a
CROSS JOIN
video b
WHERE
NOT EXISTS
(
SELECT NULL
FROM Video
WHERE a.Time BETWEEN StartTime AND EndTime
)
) c
WHERE
c.distance_factor =
(
SELECT
MIN(CASE WHEN d.Time < e.StartTime THEN UNIX_TIMESTAMP(e.StartTime) - UNIX_TIMESTAMP(d.Time) WHEN d.Time > e.EndTime THEN UNIX_TIMESTAMP(d.Time) - UNIX_TIMESTAMP(e.EndTime) END)
FROM
`Events` d
CROSS JOIN
video e
WHERE d.ID = c.EventID
)
GROUP BY
c.EventID
这会返回事件的日期不在任何视频的任何时间范围内的事件,但是会返回距离该事件日期最近的视频.
现在唯一的一件事就是有些视频的秒差完全一样.我不知道您是否希望它返回2行,但是现在,我将GROUP BY放在其中,只选择其中一行.
让我知道它是如何工作的.
标签:closest,sql,mysql 来源: https://codeday.me/bug/20191101/1981913.html