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

ORを使用して複数のLEFTJOINを作成し、複合インデックスを完全に使用するにはどうすればよいですか?

    クエリから(読みやすさの形式)

    SELECT 
          table1.*, 
          tb21.year, 
          tb21.month, 
          tb21.day, 
          tb22.year, 
          tb22.month, 
          tb22.day 
       FROM 
          table1
             LEFT JOIN table2 tb21 
                ON table1.year = tb21.year
                AND table1.month = tb21.month
                AND (tb21.day = table1.day 
                  OR tb21.day = table1.day+1)
             LEFT JOIN table2 tb22 
                ON table1.year = tb22.year
                AND table1.month = tb22.month
                AND (tb22.day = table1.day+2 
                  OR tb22.day = table1.day+3)
    

    提供される制限のあるコンテンツとは別に、同じ日のデータを+ 1、+ 2、および+3で比較しようとしているところを見てみましょう。また、この例では、Table1とTable2の両方のテーブルで2016年6月1日から6月10日までのすべてのテーブルに10日しか存在しないと仮定します。

    繰り返しになりますが、これは、レコードが非常に多い理由を単純化するために、各テーブルに問題の10個の日付がすべて含まれていることを前提としています。したがって、2016年6月1日の表1の日付の場合、表2(tb21バージョン)で修飾され、2つのレコードが返されます。 1つは6月1日、もう1つは6月2日です。これで、結果に2つのレコードが含まれます。今、あなたは再びそれを左に行います-表2(tb22バージョン)に参加します。今回は2日と3日を探していますが、そのうち6月3日と4日がテーブルにあります。したがって、デカルト結果が得られます。したがって、表1の6月1日のレコードには、次の4つのレコードがあります。

    T1Year  T1Month  T1Day  T21Day T22Day
    2016    6        1      1      3
    2016    6        1      1      4
    2016    6        1      2      3
    2016    6        1      2      4
    

    ここで、テーブル2に6月2日に3つのエントリがあり、6月3日に3つのエントリがあり、データが非常に肥大化しているとします。これが、あなたがやろうとしていることについてより明確にする必要がある理由です。

    したがって、探しているものに真のコンテキストがない場合は、インデックスを完全に利用していないという事実を無視してください。日の比較による日付に基づくORがあります。とにかくクエリに引き続き利用する必要があります。




    1. MySqlクエリを使用して完全に一致する単語を検索する方法

    2. where条件でcaseステートメントを使用する方法は?

    3. LIMITを使用したSQLクエリの結果をクエリごとに異なるようにするにはどうすればよいですか?

    4. mysqlnodejsのIN句