MySQL - 使用左连接获取未分配资源的复杂查询

标签 mysql left-join

我有以下 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/

相关文章:

mySQL LEFT JOIN 和 COUNT 右 watch 中出现的次数

php - 在 PHP 中为用户创建 Excel 文件

sql - 右表的左连接与 where 子句(必须从右返回 NULL) - Oracle

mysql - 插入而不是全部插入

mysql - 如何在我的 MySQL-Docker 容器中导入现有的 MySQL 数据库?

SQL Statement JOIN 只返回有关联的元素

java - Spring Boot JPA LEFT JOIN 在 3 个表中

mysql - LEFT JOIN with NULL, NOT EQUAL 它们都显示出意想不到的结果

php - Laravel - 所有用户的一个通知

mysql - SQL Group By of Date 不起作用