Es ist ein wenig klobig, aber hier ist, was ich mir ausgedacht habe:
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
Dadurch werden Ereignisse zurückgegeben, deren Daten nicht zwischen die Zeiträume eines Videos fallen, aber dann wird das Video zurückgegeben, das diesem Ereignisdatum am nächsten liegt.
Das einzige, was im Moment ist, ist, dass es einige Videos gibt, bei denen der Sekundenunterschied genau gleich ist. Ich weiß nicht, ob Sie möchten, dass 2 Zeilen zurückgegeben werden, aber im Moment habe ich GROUP BY eingegeben, um nur eine auszuwählen.
Lassen Sie mich wissen, wie das funktioniert.