MySQL查询问题:如何找出无学生通过的课程?
修正MySQL查询:找出无学生通过的课程
问题说明
现有三张MySQL表:
course(课程表):包含course_id(课程ID)、course_name(课程名称)字段stco(学生选课状态表):包含course_id(关联课程ID)、student_id(关联学生ID)、course_status(选课状态,如failed/passed)字段student(学生表):包含student_id(学生ID)、student_firstname(学生名)字段
需要编写查询语句找出所有没有学生通过的课程,原查询无法正常运行,以下是修正方案:
原查询的问题
- 使用内连接(
JOIN)会直接排除无学生选课的课程,若需求包含这类课程,需改用左连接(LEFT JOIN) - 通过
student_firstname关联学生表存在逻辑漏洞——重名学生会导致数据关联错误,应使用唯一标识student_id HAVING子句缺少比较逻辑,仅写sum(...)无法作为筛选条件;且原逻辑统计的是特定课程ID且挂科的人数,不符合“无学生通过”的核心需求
修正后的查询语句
场景1:包含无学生选课的课程(这类课程自然没有学生通过)
SELECT c.course_name, COUNT(st.student_id) AS enrolled_students FROM course c LEFT JOIN stco st ON st.course_id = c.course_id LEFT JOIN student s ON st.student_id = s.student_id GROUP BY c.course_id, c.course_name -- 统计通过人数为0,即无学生通过该课程 HAVING SUM(CASE WHEN st.course_status = 'passed' THEN 1 ELSE 0 END) = 0;
场景2:仅筛选有学生选课但全部未通过的课程
SELECT c.course_name, COUNT(st.student_id) AS enrolled_students FROM course c JOIN stco st ON st.course_id = c.course_id JOIN student s ON st.student_id = s.student_id GROUP BY c.course_id, c.course_name HAVING SUM(CASE WHEN st.course_status = 'passed' THEN 1 ELSE 0 END) = 0;
关键提示
- 分组时带上
course_id,避免同名课程被错误合并 - 关联表时优先使用唯一ID,不要用姓名这类可能重复的字段
CASE WHEN是统计特定状态数量的通用写法,比IN子句更灵活清晰
内容的提问来源于stack exchange,提问作者Mahzad
相关产品推荐
相关产品推荐

