Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL Join-Tabellen zur Zeit zwischen Start und Ende

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.