72 lines
1.9 KiB
SQL
72 lines
1.9 KiB
SQL
-- ========================================
|
||
-- 修复学生多班级问题
|
||
-- ========================================
|
||
|
||
-- 第一步:查看有多个班级的学生
|
||
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;
|
||
|
||
-- 应该返回空结果,说明每个学生只有一个活跃班级
|