Det er lidt klodset, men her er, hvad jeg fandt på:
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
Dette returnerer begivenheder, hvis datoer ikke falder mellem nogen af tidsintervallerne for nogen video, men returnerer derefter den video, der falder tættest på begivenhedsdatoen.
Det eneste lige nu er, at der er nogle videoer, hvor sekundforskellen er nøjagtig den samme. Jeg ved ikke, om du vil have, at den skal returnere 2 rækker, men indtil videre sætter jeg i GROUP BY for bare at vælge en.
Fortæl mig, hvordan det virker.