यह थोड़ा अटपटा है, लेकिन यहाँ मैं इसके साथ आया हूँ:
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 में रखा है।
मुझे बताएं कि यह कैसे काम करता है।