Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Tabelas de junção SQL no tempo entre o início e o fim


É um pouco desajeitado, mas aqui está o que eu inventei:
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

Isso retorna eventos cujas datas não estão entre nenhum dos intervalos de tempo de qualquer vídeo, mas retorna o vídeo que está mais próximo da data do evento.

A única coisa agora é que existem alguns vídeos em que a diferença de segundos é exatamente a mesma. Não sei se você quer que retorne 2 linhas, mas por enquanto, coloquei no GROUP BY para selecionar apenas uma.

Deixe-me saber como isso funciona.