Mysql
 sql >> Base de données >  >> RDS >> Mysql

Tables de jointure SQL sur le temps entre le début et la fin

C'est un peu maladroit, mais voici ce que j'ai trouvé :

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

Cela renvoie les événements dont les dates ne se situent dans aucune des plages horaires d'une vidéo, mais renvoie ensuite la vidéo la plus proche de cette date d'événement.

La seule chose en ce moment, c'est qu'il y a des vidéos où la différence de secondes est exactement la même. Je ne sais pas si vous voulez qu'il renvoie 2 lignes, mais pour l'instant, j'ai mis le GROUP BY pour n'en sélectionner qu'une.

Faites-moi savoir comment cela fonctionne.