Nó hơi rắc rối, nhưng đây là những gì tôi nghĩ ra:
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
Điều này trả về các sự kiện có ngày không nằm trong khoảng thời gian của bất kỳ video nào, nhưng sau đó trả về video gần nhất với ngày diễn ra sự kiện đó.
Điều duy nhất hiện tại là có một số video có sự chênh lệch số giây hoàn toàn giống nhau. Tôi không biết bạn có muốn nó trả về 2 hàng hay không, nhưng hiện tại, tôi đã đưa vào GROUP BY để chỉ chọn một hàng.
Hãy cho tôi biết cách hoạt động.