我有两个表:
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放在其中,只选择其中一行。
让我知道它是如何工作的。