Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SQL Join tabel w czasie między początkiem a końcem

Jest trochę niezgrabny, ale oto, co wymyśliłem:

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

Spowoduje to zwrócenie wydarzeń, których daty nie mieszczą się w żadnym z zakresów czasowych żadnego filmu, a następnie zwróci film, który przypada najbliżej daty tego wydarzenia.

Jedyną rzeczą w tej chwili jest to, że w niektórych filmach różnica sekund jest dokładnie taka sama. Nie wiem, czy chcesz, aby zwracał 2 wiersze, ale na razie umieszczam w GROUP BY, aby po prostu wybrać jeden.

Daj mi znać, jak to działa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Grupuj według dwóch kolumn i sumuj

  2. Jak połączyć bazę danych mysql z Dart?

  3. Jaki jest najlepszy sposób dynamicznego wybierania nazwy tabeli w czasie wykonywania?

  4. Zapytania MySQL IN są strasznie wolne z podzapytaniem, ale szybkie z określonymi wartościami

  5. Nie można wydać instrukcji manipulacji danymi za pomocą executeQuery()