98 lines
3.5 KiB
SQL
98 lines
3.5 KiB
SQL
-- 修复课件时长问题
|
||
-- 问题:课件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中重新进入课程,触发进度重新计算
|