SELECT user_id, ANY_VALUE(nickname) AS nickname, COUNT(*) c
FROM orders GROUP BY user_id;
-- 或
SELECT user_id, nickname, COUNT(*) FROM orders GROUP BY user_id, nickname;

把项目迁到 8.0 后,原来能跑的统计 SQL 全部报错,说查询列不在分组里。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,8.0 默认开启严格分组检查,select 中的非聚合列必须出现在 group by 中,旧写法会被直接拒绝。

这次卡住的地方就在「MySQL group by 1055」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

处理上按这个顺序:补全分组列或用聚合函数包裹;确实需要取任意一条时用 any_value;不建议直接关掉严格模式。

改完只确认一件事:统计 SQL 恢复执行,结果与业务口径一致,无告警。

作者 9823189