sql >> データベース >  >> RDS >> Mysql

1つのテーブル内で重複する(日付/時刻)行を検索する

    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
    

    これにより、各ペアが2回選択されます。

    各ペアを1回だけ選択する場合は、次を使用します。

    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
    

    meetingStartにインデックスがあることを確認してください およびmeetingEnd クエリが効率的に機能するようにします。

    MySQL ただし、おそらくINDEX MERGEを使用します このクエリを実行しますが、現在の実装ではあまり効率的ではありません。

    次を使用することもできます:

    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
    

    、これはより複雑ですが、おそらく少し速く実行されます。



    1. MySQLのindex_lengthはバイト単位ですか?

    2. INSERT…SELECTおよび高速ロードコンテキストを使用した最小限のロギング

    3. mysqlの3つのテーブルとの内部結合

    4. なぜsqlplusが接続しないのですか?