2017-06-05 62 views
0

我創建了這個查詢來匹配多個表的數據,但我覺得它有一點複雜。在多個表上有多個JOIN的SQL查詢

我需要從下表中選擇:

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

和:

  • 使用下面的關係導致
  • instructors_options
  • instructor_calendar

以下過濾器必須匹配:

  • 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 = '變量'
  • 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問題?這些是兩種非常不同的產品,並且你們都標記了它們。爲什麼? – pmbAustin

+0

對不起 - 我的錯誤,必須無意中點擊sql-server – charlie

+0

我注意到的第一件事是你正在尋找「必須」匹配,但有左和右連接。你確定你不想要INNER JOIN嗎?你可以有額外的加入(io4),或者你錯過了需求清單:) –

回答

2

您正在查找某些日曆條目。因此請從該表中選擇。

其中一個條件是相關的教師序列具有全部四個特定選項。因此,按照教師序列彙總選項並保留符合所有條件的選項。使用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

好吧,我可以給這個測試。另一個想法就是現在,這是在所選日期和所選日期+ 7天之間進行搜索。如果沒有結果返回,我再次運行完全相同的查詢,但更改日期過濾器。我可以在一個查詢中運行這一切,所以如果沒有結果返回,它會刪除第二個日期<=子句? – charlie

+0

在標準SQL中,您只需選擇兩個星期,然後按「ROW_NUMBER」按周排列記錄,並保持最佳排名周。 MySQL缺少這個功能。你通常用MySQL中的變量來模擬這個。 –

+0

好的,取消我最後的評論。如果沒有找到結果,我會繼續重新運行查詢。我需要循環查看日期,然後查看每個日期的時間。在循環中運行另一個查詢的最佳方法是什麼? – charlie