Mysql
 sql >> Database >  >> RDS >> Mysql

Tabelle di join SQL sul tempo tra inizio e fine

È un po' goffo, ma ecco cosa mi è venuto in mente:

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

Questo restituisce gli eventi le cui date non rientrano in nessuno degli intervalli di tempo di alcun video, ma poi restituisce il video che si avvicina di più alla data dell'evento.

L'unica cosa in questo momento è che ci sono alcuni video in cui la differenza di secondi è esattamente la stessa. Non so se vuoi che restituisca 2 righe, ma per ora ho inserito GROUP BY per selezionarne solo una.

Fammi sapere come funziona.