1 頁 (共 1 頁)

LEFT OUTER JOIN的一個複雜案例

發表於 : 2024-12-30, 23:29
dtchang

代碼: 選擇全部

  $sql  = "SELECT S.id,S.type,R.sid,S.rec_date,T.name,S.upload_by ";
  $sql .= "FROM (soa_register R INNER JOIN soa_student T ON R.sid=T.SID) LEFT OUTER JOIN soa_survey S ";
  $sql .= "ON (R.sid = S.sid AND r.syear = s.syear  AND r.semester = s.semester  AND s.type = '$type') ";
  $sql .= "WHERE  r.syear = $syear  AND r.semester = $semester AND teacher_id IN ('$teacher_id','999999') "; 
  $sql .= "AND (rec_date IS NULL OR (rec_date BETWEEN '$sdate' AND '$edate') )
ORDER BY R.sid "; 
原始的問題為查詢某學年某學期的學生(含其他導師代號999999)的全部學生是否有填寫特定的調查表(s.type = '$type').
因為 WHERE 會篩掉 NULL 的資料, 故 LEFT OUTER JOIN 右側的部份的資料需在WHERE中用 IS NULL 保留下來.
故無資料的 rec_date (沒作答日期,即為未作答)需用 rec_date IS NULL OR ... 以保留有資料和無資料.
而 s.type = '$type' 則寫在 ON 條件裡算是很特別.

測試,可先測試只查詢學生資料時有多少筆資料,例如: 30 筆.
那麼整個 LEFT OUTER JOIN 也應該是輸出 30 筆, 或者期間內有多筆資料而造成 30+.
至少每人都應有一筆資料回應. 而關聯欄位的資料需要以 LEFT OUTER JOIN 左側的資料表為主, 即如: R.sid, 而不是 S.sid