MySQL多条件AND查询:筛选满足多组教授课程条件的学生ID
解决方案:实现条件组AND关系的学生ID查询
要找到同时满足所有指定条件组的学生ID,核心思路是聚合验证每个学生是否覆盖了所有条件组——因为单条记录无法同时满足多个不同的(professorId, courseId)组合,需要通过分组统计来确认学生是否具备所有条件对应的选课记录。
方法一:GROUP BY + HAVING(推荐,适配多条件组场景)
此方法适合条件组数量不固定的情况,只需调整IN子句中的条件对和HAVING中的计数即可:
SELECT sc.studentId FROM studentsClasses sc INNER JOIN Class c ON sc.classId = c.id WHERE (c.professorId, c.courseId) IN ( (3, 4), (3, 2), (5, 8) ) GROUP BY sc.studentId HAVING COUNT(DISTINCT c.id) = 3;
逻辑说明:
- 关联表:将学生选课表与班级表通过
classId关联,获取每个选课记录对应的教授和课程信息。 - 筛选条件组:通过
IN子句匹配所有需要满足的(professorId, courseId)组合。 - 分组统计:按学生ID分组,统计该学生匹配到的不同班级ID数量(每个条件组对应唯一班级ID)。
- 验证全匹配:
HAVING子句确保统计数量等于条件组总数(此处为3),即学生覆盖了所有条件组。
方法二:多表JOIN(适合条件组较少的场景)
如果条件组数量不多,可以通过多次JOIN直接筛选同时满足所有条件的学生:
SELECT sc1.studentId FROM studentsClasses sc1 JOIN Class c1 ON sc1.classId = c1.id AND c1.professorId = 3 AND c1.courseId = 4 JOIN studentsClasses sc2 ON sc1.studentId = sc2.studentId JOIN Class c2 ON sc2.classId = c2.id AND c2.professorId = 3 AND c2.courseId = 2 JOIN studentsClasses sc3 ON sc1.studentId = sc3.studentId JOIN Class c3 ON sc3.classId = c3.id AND c3.professorId = 5 AND c3.courseId = 8;
逻辑说明:
每次JOIN对应一个条件组,逐步筛选出同时存在所有条件对应选课记录的学生ID。此方法直观但扩展性差,条件组过多时SQL会变得冗长。
测试结果
两种方法均会返回预期结果:
studentId --------- 1
内容的提问来源于stack exchange,提问作者farzad
相关产品推荐
相关产品推荐

