You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑说明:

  1. 关联表:将学生选课表与班级表通过classId关联,获取每个选课记录对应的教授和课程信息。
  2. 筛选条件组:通过IN子句匹配所有需要满足的(professorId, courseId)组合。
  3. 分组统计:按学生ID分组,统计该学生匹配到的不同班级ID数量(每个条件组对应唯一班级ID)。
  4. 验证全匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:34:59