我有以下 fiddle 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)的所有科目提取到该教授是类主任的类(class),以及该类(class)的所有未分配给任何其他教授的科目。 (例如,professor_id = 198 已为 class_id = 426 分配了 subject_id = 67,但该类(class)还有两个未分配的科目需要获取)。
在给定的示例中,第一个查询获取 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 逻辑。
关于MySQL - 使用左连接获取未分配资源的复杂查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24763162/