sql >> Database teknologi >  >> RDS >> Mysql

Find overlappende (dato/klokkeslæt) rækker i én tabel

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

Dette vil vælge hvert par to gange.

Hvis du ønsker, at hvert par kun skal vælges én gang, skal du bruge:

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

Sørg for, at du har indekser på meetingStart og meetingEnd for at forespørgslen fungerer effektivt.

MySQL , vil dog sandsynligvis bruge INDEX MERGE at køre denne forespørgsel, som ikke er særlig effektiv i den nuværende implementering.

Du kan også prøve at bruge:

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

, som er mere kompleks, men sandsynligvis vil køre en lille smule hurtigere.



  1. Hvordan tester man, om JDBC-driveren er installeret korrekt, og om DB'en kan tilsluttes?

  2. Hvordan specificerer man det overordnede forespørgselsfelt inde fra en underforespørgsel i MySQL?

  3. 3 måder at returnere en streng af flere mellemrum i SQL Server

  4. Er mysql_insert_id tråd sikker?