sql >> Databasteknik >  >> RDS >> Mysql

SQL Sammanfoga tabeller på tid mellan start och slut

Det är lite klumpigt, men här är vad jag kom på:

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

Detta returnerar händelser vars datum inte ligger mellan någon av tidsintervallen för någon video, men returnerar sedan den video som ligger närmast händelsedatumet.

Det enda just nu är att det finns några videor där sekundskillnaden är exakt densamma. Jag vet inte om du vill att den ska returnera 2 rader, men för tillfället lägger jag in GROUP BY för att bara välja en.

Låt mig veta hur det fungerar.



  1. Castle Activecord-felet är "relationen existerar inte" på Postgresql?

  2. PHP (MySQL)-fel:Varning:mysql_num_rows() förväntar sig att parameter 1 är resurs

  3. Hur genererar jag ett slumpmässigt tidsintervall och lägger till det i en mysql datetime med php?

  4. Hur man väljer den första raden i varje GRUPP FÖR Grupp