数据库
首页 > 数据库> > mysql-开始和结束之间的时间的SQL Join表

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