sql >> Database >  >> RDS >> Mysql

SQL Join-tabellen op tijd tussen begin en einde

Het is een beetje onhandig, maar dit is wat ik bedacht:

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

Dit retourneert evenementen waarvan de datums niet binnen een van de tijdbereiken van een video vallen, maar retourneert vervolgens de video die het dichtst bij die gebeurtenisdatum valt.

Het enige dat op dit moment is, is dat er enkele video's zijn waarbij het verschil in seconden precies hetzelfde is. Ik weet niet of je wilt dat het 2 rijen retourneert, maar voor nu heb ik de GROUP BY ingevoerd om er maar één te selecteren.

Laat me weten hoe dat werkt.



  1. Combineer meerdere rijen in één MySQL Join

  2. Hoe verander ik alle tabellen in mijn database in een UTF8-tekenset?

  3. Oracle SQL-query om opeenvolgende records te groeperen

  4. Hoe u kunt profiteren van de nieuwe partitioneringsfuncties in PostgreSQL 11