评分分布图上 5 星的柱子只有 12 份,4 星却有 180 份,原始数据里 5 星明明有 210 份。日志里能对上时间点,这种反而好排。

分组时 score 字段是 varchar,GROUP BY 之后按字典序取,5 被拆成了 5.0 和 5 两组。图表只读了其中一组。这一点先确认清楚,后面就不用反复试。

SELECT FLOOR(score) AS star, COUNT(*) c FROM wp_survey_answer GROUP BY star;

「评分分布统计」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

处理上按这个顺序:分组前把 score 转成 decimal,或者按 floor 取整分组;查一遍有没有 5.0 这类历史脏值,统一格式;用一份已知分布的数据核对每根柱子的数量。

结果对不对很好判断,五根柱子的数量加起来等于总份数,5 星回到 210 份。

作者 9823189