-- ======================================== -- 修复学生多班级问题 -- ======================================== -- 第一步:查看有多个班级的学生 SELECT student_id, COUNT(*) as class_count, GROUP_CONCAT(class_id ORDER BY join_time DESC) as class_ids, GROUP_CONCAT(join_time ORDER BY join_time DESC) as join_times FROM student_class WHERE status = 1 GROUP BY student_id HAVING COUNT(*) > 1; -- 第二步:查看编号206的详细记录 SELECT sc.id, sc.student_id, sc.class_id, c.class_name, sc.status, sc.join_time, sc.create_time FROM student_class sc LEFT JOIN class c ON sc.class_id = c.id WHERE sc.student_id = 206 ORDER BY sc.join_time DESC, sc.create_time DESC; -- 第三步:修复数据(保留最新的班级记录,其他设为status=0) -- ⚠️ 请先执行上面的查询确认数据后,再执行此更新! -- 方法:为每个学生只保留join_time最新的那条记录 UPDATE student_class sc1 SET status = 0 WHERE status = 1 AND student_id IN ( -- 找出有多个班级的学生 SELECT student_id FROM ( SELECT student_id FROM student_class WHERE status = 1 GROUP BY student_id HAVING COUNT(*) > 1 ) AS multi_class_students ) AND id NOT IN ( -- 为每个学生保留join_time最新的记录 SELECT id FROM ( SELECT id FROM student_class sc2 WHERE sc2.status = 1 AND sc2.student_id = sc1.student_id ORDER BY sc2.join_time DESC, sc2.create_time DESC LIMIT 1 ) AS keep_records ); -- 第四步:验证修复结果 SELECT student_id, COUNT(*) as active_class_count, GROUP_CONCAT(class_id) as class_ids FROM student_class WHERE status = 1 GROUP BY student_id HAVING COUNT(*) > 1; -- 应该返回空结果,说明每个学生只有一个活跃班级