sql >> Databáze >  >> RDS >> Mysql

Najděte překrývající se řádky (datum/čas) v jedné tabulce

SELECT  m1.meetingID, m1.meetingStart, m1.meetingEnd, m2.meetingID
FROM    t_meeting m1, t_meeting m2
WHERE   (m2.meetingStart BETWEEN m1.meetingStart AND m1.meetingEnd
        OR m2.meetingEnd BETWEEN m1.meetingStart AND m1.meetingEnd)
        AND m1.meetingID <> m2.meetingID

Tím vyberete každý pár dvakrát.

Pokud chcete, aby byl každý pár vybrán pouze jednou, použijte:

SELECT  m1.meetingID, m1.meetingStart, m1.meetingEnd, m2.meetingID
FROM    t_meeting m1, t_meeting m2
WHERE   (m2.meetingStart BETWEEN m1.meetingStart AND m1.meetingEnd
        OR m2.meetingEnd BETWEEN m1.meetingStart AND m1.meetingEnd)
        AND m2.meetingID > m1.meetingID

Ujistěte se, že máte indexy na meetingStart a meetingEnd aby dotaz fungoval efektivně.

MySQL , nicméně pravděpodobně použije INDEX MERGE spustit tento dotaz, což není v současné implementaci příliš efektivní.

Můžete také zkusit použít:

SELECT  m1.*, m2.*
FROM    (
        SELECT  m1.meetingID AS mid1, m2.meetingID AS mid2
        FROM    t_meeting m1, t_meeting m2
        WHERE   m2.meetingStart BETWEEN m1.meetingStart AND m1.meetingEnd
                AND m2.meetingID <> m1.meetingID
        UNION
        SELECT  m1.meetingID, m2.meetingID
        FROM    t_meeting m1, t_meeting m2
        WHERE   m2.meetingEnd BETWEEN m1.meetingStart AND m1.meetingEnd
                AND m2.meetingID <> m1.meetingID
        ) mo, t_meeting m1, t_meeting m2
WHERE   m1.meetingID = mid1
        AND m2.meetingID = mid2

, který je složitější, ale s největší pravděpodobností poběží o něco rychleji.



  1. Jak importovat soubor XML v Oracle SQL Developer?

  2. MSSQL Regulární výraz

  3. Vložení MySQL pomocí smyčky While

  4. Jak mohu zachovat jedinečné hodnoty sloupce v MySQL?