我想找到学生id,必须有(professorId = 3 And courseId = 4) And (professorId = 3 And courseId = 2) And (professorId = 5 And courseId = 8)。 有时这些括号是 1 个或超过 20 个
我有两个表班和学生班是这样的:
学生班级表:
id | studentId | classId
1 1 2
2 1 3
3 1 4
4 2 3
5 2 5
6 3 2
7 4 3
8 4 2
9 1 8
班级表:
id | professorId | CourseId
1 1 1
2 3 4
3 2 5
4 3 2
5 4 2
6 2 3
7 5 6
8 5 8
9 5 9
如果每个括号都充当或,那就非常简单了。但我想找到一个以和的形式拥有所有这些东西的学生。
这个查询是“OR”场景:
select `studentsClasses`.`studentId` from `studentsClasses`
inner join `class` on (`studentsClasses`.`classId`=`class`.`id`
AND ((professorId = 3 And courseId = 4) OR (professorId = 3 And courseId = 2)
OR (professorId = 5 And courseId = 8)))
但我想要这样的场景:
select `studentsClasses`.`studentId` from `studentsClasses`
inner join `class` on (`studentsClasses`.`classId`=`class`.`id`
AND ((professorId = 3 And courseId = 4) AND (professorId = 3 And courseId = 2)
AND (professorId = 5 And courseId = 8)))
但是上面的查询是错误的。
例如,具有这些值的结果查询应该是:
studentId
---------
1
我想到的一种方法是对每个条件使用单独的连接。这不是一个有效的解决方案,但如果数据不是太大的话可能没问题。
SELECT DISTINCT s.studentId FROM studentsClasses s
JOIN `class` c1 ON s.classId = c1.id AND c1.professorId = 3 AND c1.courseId = 4
JOIN `class` c2 ON s.classId = c2.id AND c2.professorId = 3 AND c2.courseId = 2
JOIN `class` c3 ON s.classId = c3.id AND c3.professorId = 5 AND c3.courseId = 8