sql >> Databasteknik >  >> RDS >> Mysql

Hitta överlappande (datum/tid) rader i en tabell

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

Detta kommer att välja varje par två gånger.

Om du vill att varje par bara ska väljas en gång, använd:

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

Se till att du har index på meetingStart och meetingEnd för att frågan ska fungera effektivt.

MySQL , dock kommer förmodligen att använda INDEX MERGE att köra den här frågan, som inte är särskilt effektiv i nuvarande implementering.

Du kan också försöka använda:

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

, vilket är mer komplext men kommer troligen att köras lite snabbare.



  1. Omfördela röster samtidigt som du eliminerar kandidater

  2. Olika representation av UUID i Java Hibernate och SQL Server

  3. Hur kan jag testa mitt PHP MySQL-injektionsexempel?

  4. Är kopiering av katalogen /var/lib/mysql ett bra alternativ till mysqldump?