如何编写SQL按班级导出学生出勤报告及查询同时上两门课的学生
同时选修两门课的学生查询SQL修改方案
方案1:分组聚合+HAVING筛选(推荐,性能更优)
SELECT s.id, s.name FROM attendance a INNER JOIN students s ON a.student_id = s.id WHERE a.class_id IN (1,2) GROUP BY s.id, s.name HAVING COUNT(DISTINCT a.class_id) = 2;
逻辑说明:
- 先用
WHERE过滤出所有数学、科学课的出勤记录,缩小数据处理范围 - 按学生ID、姓名分组,保证每个学生仅对应一条统计结果
HAVING子句统计每个学生关联的不同课程ID数量,等于2就说明同时有两门课的出勤记录,符合筛选要求- 此处
DISTINCT用于兼容同一名学生同一门课有多条出勤记录的场景,如果业务规则保证每个学生每门课仅有1条出勤记录,可以去掉DISTINCT直接使用COUNT(a.class_id) = 2
方案2:双关联匹配实现
SELECT DISTINCT s.id, s.name FROM students s INNER JOIN attendance a1 ON s.id = a1.student_id AND a1.class_id = 1 INNER JOIN attendance a2 ON s.id = a2.student_id AND a2.class_id = 2;
逻辑说明:
- 第一次关联出勤表匹配学生的数学课出勤记录
- 第二次关联出勤表匹配学生的科学课出勤记录
- 只有同时满足两次关联条件的学生才会被保留,天然就是同时参加两门课的学生
DISTINCT用于避免同一名学生同一门课有多条记录时出现重复结果
内容的提问来源于stack exchange,提问作者Omar Ehab
相关产品推荐
相关产品推荐

