簡體   English   中英

MySQL-使用左聯接來獲取未分配資源的復雜查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM