2017-06-05 20 views
0

複数のテーブルとデータを照合するためにこのクエリを作成しましたが、少し複雑に感じられます。複数のテーブルで複数のJOINSを使用するSQLクエリ

私は、次の表から選択する必要があります。

leads.sequence = instructors_options.instructor_seq 
leads.sequence = instructor_calendar.instructor_seq 

と:

  • には、以下の関係を使用して

instructor_calendar

  • instructors_options
  • をリード次のフィルタが一致しなければならない:

    • lead.lead_type = 'インストラクター'
    • instructors_options.option_name = 'pupil_cap' AND instructors_options.value> 0
    • instructors_options.option_name = 'car_type' AND instructors_options.value = '変数」
    • instructors_options.option_nameは= 'areas_covered' AND instructors_options.valueは= 'AVAILABLE変数'
    • instructor_calendar.pupil_name = '' AND instructor_calendar.date> = '変数' AND instructor_calendar.date < = '' 変数
    • instructors_options.option_name = 'diary_updates' AND instructors_options.value = '1'

      SELECT i.sequence as instructor_seq, 
             ic.date AS date, 
             ic.start_time AS start_time, 
             ic.end_time AS end_time 
           FROM 
            leads i 
      
           LEFT JOIN 
            instructors_options io 
           ON 
            i.sequence = io.instructor_seq AND 
            (io.option_name = 'pupil_cap' AND io.value > '0') 
      
           RIGHT JOIN 
            instructors_options io2 
           ON 
            i.sequence = io2.instructor_seq AND 
            io2.option_name = 'car_type' AND io2.value = '".$bookingData["car_type"]."' 
      
           RIGHT JOIN 
            instructors_options io3 
           ON 
            i.sequence = io3.instructor_seq AND 
            io3.option_name = 'areas_covered' AND (io3.value LIKE '".substr($postcode, 0, 1)."' OR io3.value LIKE '".substr($postcode, 0, 2)."' OR io3.value LIKE '".substr($postcode, 0, 3)."' OR io3.value LIKE '".substr($postcode, 0, 4)."') 
      
           RIGHT JOIN 
            instructors_options io4 
           ON 
            i.sequence = io4.instructor_seq AND 
            io4.option_name = 'diary_updates' AND io4.value = '1' 
      
           RIGHT JOIN 
            instructor_calendar ic 
           ON 
            i.sequence = ic.instructor_seq AND 
            ic.pupil_name = 'AVAILABLE' AND 
            ic.date >= '".ChangeDateFormat($date, 'Y-m-d')."' AND 
            ic.date <= '".date('Y-m-d', strtotime($date. ' + 7 days'))."' 
           WHERE 
            i.lead_type = 'Instructor' 
           GROUP BY date 
           ORDER BY date ASC, start_time ASC 
      

    誰かが私が私が

    はありがとう正しくそれを行っていることを確認するために私のクエリを更新助けてください!

  • +0

    これはMySQLの質問ですか、SQLServerの質問ですか?これらは2つの非常に異なる製品で、タグが付けられています。どうして? – pmbAustin

    +0

    申し訳ありません - 私の間違いは、誤ってsql-serverをクリックしたに違いありません。 – charlie

    +0

    最初に気がついたのは、「必ず」マッチを探していますが、左と右のジョインがあります。あなたはINNER JOINを望んでいませんか?そして、余分な結合(io4)があるか、要件リストでそれを見逃しています:) –

    答えて

    2

    特定のカレンダーエントリを探しています。そのテーブルから選択します。

    条件の1つは、関連する講師シーケンスに4つの特定のオプションがすべて含まれていることです。インストラクターシーケンスごとにオプションを集計し、すべての基準に合致する人を保持してください。 IN句を使用して、これらの講師シーケンスのカレンダーエントリを取得します。

    select 
        instructor_seq, 
        date, 
        start_time, 
        end_time 
    from instructor_calendar 
    where pupil_name = 'AVAILABLE' 
    and date >= '2017-01-01' 
    and date <= '2017-05-31' 
    and instructor_seq in 
    (
        select instructor_seq 
        from instructors_options 
        group by instructor_seq 
        having sum(option_name = 'pupil_cap'  and value > 0) > 0 
        and sum(option_name = 'car_type'  and value = 123) > 0 
        and sum(option_name = 'areas_covered' and value = 456) > 0 
        and sum(option_name = 'diary_updates' and value = 1) > 0 
    ); 
    

    HAVING句を経由して、MySQLのtrue = 1false = 0を使用しています。

    +0

    私はこれをテストにすることができます。もう1つの考えは今現在、選択された日付と選択された日付+ 7日間を検索しています。結果が返されない場合、私はまったく同じクエリを再度実行しますが、日付フィルタを変更します。これをすべて1つのクエリで実行できるので、結果が返されない場合、2番目の日付<=句が削除されますか? – charlie

    +0

    標準のSQLでは、単に両方の週を選択して、週ごとにレコードを「ROW_NUMBER」でランク付けし、最善のランクを維持します。 MySQLにはこの機能がありません。あなたは通常これをMySQLの変数でエミュレートします。 –

    +0

    ok、最後のコメントをスクラップします。結果が見つからない場合は、クエリを再実行します。私は最初に日付をループし、次に各日付の時間をループする必要があります。ループ内で別のクエリを実行する最善の方法ですか? – charlie

    関連する問題