MySQL表插入新值后统计近100条未出现数字并更新字段
解决MySQL插入后统计最近100条未出现数字的需求
我来帮你搞定这个需求!每次插入0-99的数字后,自动统计最近100条记录里没覆盖到的数字数量并更新字段,咱们可以用触发器实现自动化,也可以手动执行SQL语句,两种方案我都给你整理好:
核心思路
0-99总共是100个唯一数字,所以未出现的数量 = 100 - 最近100条记录中不同winner值的数量。咱们只需要先获取最近100条的去重winner值,再用100减去这个计数就能得到结果。
方案一:用触发器自动更新(推荐)
触发器会在每次插入新记录后自动执行统计和更新操作,完全不用手动干预,适合不定期插入的场景。
步骤1:创建触发器
把下面的SQL中的your_table_name替换成你的实际表名,执行即可:
DELIMITER // CREATE TRIGGER update_missing_count_after_insert AFTER INSERT ON your_table_name FOR EACH ROW BEGIN DECLARE missing_num INT; -- 计算最近100条记录中未出现的数字数量 SELECT 100 - COUNT(DISTINCT winner) INTO missing_num FROM ( SELECT winner FROM your_table_name ORDER BY num DESC LIMIT 100 ) AS recent_records; -- 更新刚插入的那条记录的统计字段 UPDATE your_table_name SET not_in_last_100_repetitions = missing_num WHERE num = NEW.num; END // DELIMITER ;
说明
- 当表中记录不足100条时,触发器会自动取所有现有记录计算,结果依然准确。
- 注意
winner字段是varchar类型,要确保插入的是0-99的有效数字(比如不要插入非数字字符串),否则会影响统计结果。如果可以的话,建议把winner改成int类型,更严谨。
方案二:手动执行SQL更新(适合临时需求)
如果你不想用触发器,每次插入新记录后,执行下面的SQL也能完成更新:
-- 先计算未出现的数字数量 SET @missing_count = ( SELECT 100 - COUNT(DISTINCT winner) FROM ( SELECT winner FROM your_table_name ORDER BY num DESC LIMIT 100 ) AS recent_100 ); -- 更新最新插入记录的统计字段 UPDATE your_table_name SET not_in_last_100_repetitions = @missing_count WHERE num = (SELECT MAX(num) FROM your_table_name);
测试验证
比如插入几个数字后,你可以执行下面的SQL查看结果是否正确:
SELECT num, winner, not_in_last_100_repetitions FROM your_table_name ORDER BY num DESC LIMIT 5;
如果最近100条记录覆盖了0-99所有数字,not_in_last_100_repetitions会显示0;如果有20个数字没出现,就会显示20,完全符合需求。
内容的提问来源于stack exchange,提问作者Cool Guy
相关产品推荐
相关产品推荐

