[英]MySQL - complex query using left join to fetch unassigned resource
我有以下小提琴http://sqlfiddle.com/#!2/5c089/2
這是數據庫表的架構:
類 :
id
school_id
classes_academic_years :
id
class_id
name
academic_year_id
grade
classes_subjects :
id
class_academic_year_id
subject_id
class_masters :
id
class_academic_year_id
professor_id
教授 :
id
school_id
first_name
last_name
Professors_subjects :
id
professor_id
subject_id
Professors_classes_subjects :
id
professor_id
class_academic_year_id
subject_id
學科 :
id
name
school_id
default
我有兩個查詢:
select subjects.* from subjects
inner join professors_subjects on professors_subjects.subject_id = subjects.id
where professors_subjects.professor_id = 198;
和
SELECT DISTINCT `subjects`.*
FROM `subjects`
INNER JOIN `classes_subjects` ON classes_subjects.subject_id = subjects.id
INNER JOIN `classes_academic_years` ON classes_academic_years.id = classes_subjects.class_academic_year_id
LEFT JOIN `professors_classes_subjects` ON professors_classes_subjects.class_academic_year_id = classes_subjects.class_academic_year_id and professors_classes_subjects.subject_id = classes_subjects.subject_id
left join `class_masters` on class_masters.class_academic_year_id = classes_academic_years.id
WHERE ((professors_classes_subjects.id is null or professors_classes_subjects.professor_id = 198) and class_masters.professor_id = 198 )
AND (classes_academic_years.academic_year_id = 3)
AND (subjects.default = 0)
ORDER BY `name` asc;
第一個簡單地獲取分配給某個教授的所有科目(professor_id = 198)。
第二個將獲取分配給該教授所屬班級的某位教授的所有科目(professor_id = 198),以及該班級的所有未分配給任何其他教授的科目。 (例如,Professor_id = 198已為class_id = 426分配了subject_id = 67,但是必須從該類中再獲取兩個未分配的主題)。
在給定的示例中,第一個查詢獲取ID為76和67的主題,第二個查詢獲取ID為86、72和67的主題。
這兩個查詢都很好。 但是,我需要結合這兩者的第三個查詢(例如,它應該獲取ID為76、67、86和72的主題)。 我希望使用左聯接,從而避免使用UNION運算符。
您對第三個查詢有什么想法嗎?
嘗試這個:
SELECT DISTINCT `subjects`.*
FROM `subjects`
INNER JOIN `classes_subjects` ON classes_subjects.subject_id = subjects.id
INNER JOIN `classes_academic_years` ON classes_academic_years.id = classes_subjects.class_academic_year_id
LEFT JOIN `professors_classes_subjects` ON professors_classes_subjects.class_academic_year_id = classes_subjects.class_academic_year_id and professors_classes_subjects.subject_id = classes_subjects.subject_id
left join `class_masters` on class_masters.class_academic_year_id = classes_academic_years.id
left join professors_subjects on professors_subjects.subject_id = subjects.id
WHERE (((professors_classes_subjects.id is null or professors_classes_subjects.professor_id = 198) and class_masters.professor_id = 198 )
AND (classes_academic_years.academic_year_id = 3)
AND (subjects.default = 0))
OR professors_subjects.professor_id = 198
ORDER BY `name` asc;
我引入了另一個左聯接(以聯接您在第一個查詢中擁有的表),並向整個WHERE子句添加了OR邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.