guoyu/Test/sql/修复课件时长.sql

98 lines
3.5 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 修复课件时长问题
-- 问题课件duration字段为0或NULL导致学习进度计算不准确
-- 解决:根据实际视频文件更新时长,或手动设置合理的时长
-- 1. 查看当前课件时长情况
SELECT
id,
courseware_name AS ,
type AS ,
duration AS ,
CASE
WHEN duration IS NULL OR duration = 0 THEN '❌ 需要修复'
ELSE '✅ 正常'
END AS ,
file_path AS
FROM study_courseware
WHERE course_id = 1 -- 修改为你要检查的课程ID
ORDER BY courseware_order;
-- 2. 手动更新课件时长(根据实际视频时长)
-- 示例:假设你的视频实际时长如下
-- 更新课件ID=883的时长为60秒请根据实际情况修改
UPDATE study_courseware SET duration = 60 WHERE id = 883;
-- 更新课件ID=884的时长为120秒
UPDATE study_courseware SET duration = 120 WHERE id = 884;
-- 更新课件ID=885的时长为90秒
UPDATE study_courseware SET duration = 90 WHERE id = 885;
-- 更新课件ID=886的时长为150秒
UPDATE study_courseware SET duration = 150 WHERE id = 886;
-- 更新课件ID=887的时长为180秒
UPDATE study_courseware SET duration = 180 WHERE id = 887;
-- 3. 批量更新为所有duration为0或NULL的视频课件设置默认时长60秒
-- ⚠️ 慎用!建议先查看具体视频再设置准确时长
-- UPDATE study_courseware
-- SET duration = 60
-- WHERE type = 'video'
-- AND (duration IS NULL OR duration = 0);
-- 4. 验证更新结果
SELECT
id,
courseware_name AS ,
duration AS ,
ROUND(duration / 60, 2) AS ,
file_path AS
FROM study_courseware
WHERE course_id = 1 -- 修改为你的课程ID
AND type = 'video'
ORDER BY courseware_order;
-- 5. 重新计算学习进度(更新课件时长后,需要触发进度重算)
-- 方法A: 删除学习记录,让用户重新学习时自动计算
-- DELETE FROM study_learning_record WHERE student_id = 452 AND course_id = 1;
-- 方法B: 保留学习记录手动更新进度为0下次学习时会重新计算
-- UPDATE study_learning_record
-- SET progress = 0
-- WHERE student_id = 452 AND course_id = 1;
-- 6. 查看学习详情,检查是否有异常数据
SELECT
sld.id,
sld.courseware_id AS ID,
sc.courseware_name AS ,
sc.duration AS ,
sld.video_position AS ,
CASE
WHEN sc.duration > 0 THEN ROUND(sld.video_position * 100.0 / sc.duration, 2)
ELSE NULL
END AS ,
CASE
WHEN sld.video_position >= sc.duration * 0.9 THEN '✅ 已完成'
WHEN sld.video_position == (
SELECT MAX(video_position)
FROM study_learning_detail
WHERE courseware_id = sld.courseware_id
AND student_id = sld.student_id
) AND sld.video_position >= 3 THEN '✅ 已完成(到达最远位置)'
ELSE '⏸️ 未完成'
END AS
FROM study_learning_detail sld
LEFT JOIN study_courseware sc ON sld.courseware_id = sc.id
WHERE sld.student_id = 452 -- 修改为你的学生ID
AND sld.course_id = 1 -- 修改为你的课程ID
ORDER BY sld.courseware_id, sld.video_position DESC;
-- 注意事项:
-- 1. 执行UPDATE语句前请务必先备份数据库
-- 2. 根据实际视频时长设置duration值单位
-- 3. 更新后,下次学习时系统会自动重新计算进度
-- 4. 可以在APP中重新进入课程触发进度重新计算