sql >> Base de Datos >  >> RDS >> Mysql

Tablas SQL Join en el tiempo entre el inicio y el final

Es un poco torpe, pero esto es lo que se me ocurrió:

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

Esto devuelve eventos cuyas fechas no se encuentran entre ninguno de los intervalos de tiempo de ningún video, pero luego devuelve el video que se acerca más a la fecha de ese evento.

Lo único ahora mismo es que hay algunos videos donde la diferencia de segundos es exactamente la misma. No sé si quieres que devuelva 2 filas, pero por ahora, puse GROUP BY para seleccionar solo una.

Déjame saber cómo funciona.