104 lines
2.9 KiB
MySQL
104 lines
2.9 KiB
MySQL
|
|
-- ========================================
|
||
|
|
-- 清理重复测评记录
|
||
|
|
-- 每个用户对每个量表只保留最新的一条记录
|
||
|
|
-- 创建时间: 2025-12-02
|
||
|
|
-- ========================================
|
||
|
|
|
||
|
|
-- 第一步:查看重复记录情况
|
||
|
|
SELECT
|
||
|
|
user_id,
|
||
|
|
scale_id,
|
||
|
|
COUNT(*) as record_count,
|
||
|
|
GROUP_CONCAT(assessment_id ORDER BY assessment_id DESC) as assessment_ids,
|
||
|
|
GROUP_CONCAT(status) as statuses
|
||
|
|
FROM psy_assessment
|
||
|
|
WHERE user_id IS NOT NULL
|
||
|
|
GROUP BY user_id, scale_id
|
||
|
|
HAVING COUNT(*) > 1
|
||
|
|
ORDER BY record_count DESC;
|
||
|
|
|
||
|
|
-- 第二步:查看将要删除的记录(预览)
|
||
|
|
SELECT a.*
|
||
|
|
FROM psy_assessment a
|
||
|
|
WHERE a.assessment_id NOT IN (
|
||
|
|
SELECT MAX(t.assessment_id)
|
||
|
|
FROM psy_assessment t
|
||
|
|
WHERE t.user_id IS NOT NULL
|
||
|
|
GROUP BY t.user_id, t.scale_id
|
||
|
|
)
|
||
|
|
AND a.user_id IS NOT NULL
|
||
|
|
ORDER BY a.user_id, a.scale_id, a.assessment_id;
|
||
|
|
|
||
|
|
-- 第三步:备份将要删除的记录
|
||
|
|
CREATE TABLE IF NOT EXISTS psy_assessment_backup_duplicate AS
|
||
|
|
SELECT a.*
|
||
|
|
FROM psy_assessment a
|
||
|
|
WHERE a.assessment_id NOT IN (
|
||
|
|
SELECT MAX(t.assessment_id)
|
||
|
|
FROM psy_assessment t
|
||
|
|
WHERE t.user_id IS NOT NULL
|
||
|
|
GROUP BY t.user_id, t.scale_id
|
||
|
|
)
|
||
|
|
AND a.user_id IS NOT NULL;
|
||
|
|
|
||
|
|
-- 验证备份
|
||
|
|
SELECT COUNT(*) AS '备份的重复记录数' FROM psy_assessment_backup_duplicate;
|
||
|
|
|
||
|
|
-- 第四步:删除相关的答案记录
|
||
|
|
DELETE FROM psy_assessment_answer
|
||
|
|
WHERE assessment_id IN (
|
||
|
|
SELECT assessment_id FROM psy_assessment_backup_duplicate
|
||
|
|
);
|
||
|
|
|
||
|
|
-- 第五步:删除相关的因子得分记录
|
||
|
|
DELETE FROM psy_factor_score
|
||
|
|
WHERE assessment_id IN (
|
||
|
|
SELECT assessment_id FROM psy_assessment_backup_duplicate
|
||
|
|
);
|
||
|
|
|
||
|
|
-- 第六步:删除相关的预警记录
|
||
|
|
DELETE FROM psy_warning
|
||
|
|
WHERE assessment_id IN (
|
||
|
|
SELECT assessment_id FROM psy_assessment_backup_duplicate
|
||
|
|
);
|
||
|
|
|
||
|
|
-- 第七步:删除相关的报告记录
|
||
|
|
DELETE FROM psy_assessment_report
|
||
|
|
WHERE assessment_id IN (
|
||
|
|
SELECT assessment_id FROM psy_assessment_backup_duplicate
|
||
|
|
);
|
||
|
|
|
||
|
|
-- 第八步:删除重复的测评记录(只保留每个用户对每个量表的最新记录)
|
||
|
|
DELETE FROM psy_assessment
|
||
|
|
WHERE assessment_id IN (
|
||
|
|
SELECT assessment_id FROM psy_assessment_backup_duplicate
|
||
|
|
);
|
||
|
|
|
||
|
|
-- 第九步:验证清理结果
|
||
|
|
SELECT
|
||
|
|
user_id,
|
||
|
|
scale_id,
|
||
|
|
COUNT(*) as record_count
|
||
|
|
FROM psy_assessment
|
||
|
|
WHERE user_id IS NOT NULL
|
||
|
|
GROUP BY user_id, scale_id
|
||
|
|
HAVING COUNT(*) > 1;
|
||
|
|
-- 如果返回空结果,说明清理成功
|
||
|
|
|
||
|
|
-- 第十步:查看清理后的记录数
|
||
|
|
SELECT COUNT(*) AS '清理后的测评记录数' FROM psy_assessment;
|
||
|
|
|
||
|
|
-- ========================================
|
||
|
|
-- 如果需要恢复数据,执行以下语句:
|
||
|
|
-- ========================================
|
||
|
|
/*
|
||
|
|
INSERT INTO psy_assessment SELECT * FROM psy_assessment_backup_duplicate;
|
||
|
|
*/
|
||
|
|
|
||
|
|
-- ========================================
|
||
|
|
-- 清理完成后,可以删除备份表:
|
||
|
|
-- ========================================
|
||
|
|
/*
|
||
|
|
DROP TABLE IF EXISTS psy_assessment_backup_duplicate;
|
||
|
|
*/
|