如何使用MySQL变量保存平均年龄并删除年龄低于均值的行
删除Persons表中年龄低于平均年龄的记录(含变量用法修正)
原代码的问题
你的代码失效核心原因有两点:
- 赋值
@age时,select TIMESTAMPDIFF(YEAR, birthDate, CURDATE()) from Persons返回多行结果,但MySQL用户变量只会保留最后一行的计算值,无法对应每个用户的年龄。 - 基于错误的
@age计算出的@avgAge并非全表的平均年龄,导致后续删除逻辑完全错误。
方案1:直接子查询(最简高效)
无需变量,直接嵌套子查询计算平均年龄并作为过滤条件:
START TRANSACTION; DELETE FROM Persons WHERE TIMESTAMPDIFF(YEAR, birthDate, CURDATE()) < ( SELECT AVG(TIMESTAMPDIFF(YEAR, birthDate, CURDATE())) FROM Persons ); -- 确认删除结果正确后执行COMMIT,否则保持ROLLBACK -- COMMIT; ROLLBACK;
方案2:正确使用变量存储平均年龄
如果一定要用变量,需先计算并存储全表的平均年龄,再用该变量匹配每个用户的年龄:
-- 先计算全表平均年龄并存入变量 SET @avgAge = ( SELECT AVG(TIMESTAMPDIFF(YEAR, birthDate, CURDATE())) FROM Persons ); START TRANSACTION; DELETE FROM Persons WHERE TIMESTAMPDIFF(YEAR, birthDate, CURDATE()) < @avgAge; -- 确认后执行COMMIT,否则ROLLBACK -- COMMIT; ROLLBACK;
内容的提问来源于stack exchange,提问作者Or Shalmayev
相关产品推荐
相关产品推荐

