### Cause: java.sql.SQLSyntaxErrorException: Expression #56 of SELECT list is not in GROUP BY clause
·
报错原因
sql_mode=only_full_group_by 是MySQL严格分组模式:
SELECT 里所有非聚合字段,必须全部写到 GROUP BY 后面。
你第56列 dti.nick_name 既没加聚合函数(SUM/MAX/MIN等),又没写在 GROUP BY 中,直接报错。
三种解决方案(从推荐到临时应急)
方案1:规范SQL(推荐,不改数据库配置)
情况A:nick_name 需要分组维度,加到 group by
SELECT
id,
nick_name,
COUNT(*) AS total
FROM cloud_rent.dti
GROUP BY id, nick_name; -- 所有普通字段都放这里
情况B:同分组下只取任意一个nick_name,用聚合包裹
不想多分组,就给字段套 MAX() / MIN():
SELECT
id,
MAX(nick_name) AS nick_name, -- 聚合处理
COUNT(*) AS total
FROM cloud_rent.dti
GROUP BY id;
方案2:临时关闭 only_full_group_by(仅测试环境,不建议生产)
1)当前会话生效,重启MySQL失效
SET sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
2)永久修改(my.cnf/my.ini)
找到 sql_mode,删掉 ONLY_FULL_GROUP_BY,重启MySQL服务:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
方案3:使用ANY_VALUE() 兼容写法(MySQL5.7+/8.0推荐)
明确告诉数据库同分组取任意一条该字段值,不用加聚合、不用改group by:
SELECT
id,
ANY_VALUE(nick_name) AS nick_name,
COUNT(*) AS total
FROM cloud_rent.dti
GROUP BY id;
举个你报错场景完整示例
错误SQL(会报你这个错):
SELECT id, nick_name, COUNT(*)
FROM cloud_rent.dti
GROUP BY id;
修复后:
SELECT id, ANY_VALUE(nick_name) AS nick_name, COUNT(*)
FROM cloud_rent.dti
GROUP BY id;
补充说明
- 生产环境不要关闭 only_full_group_by,该模式是防止分组查询逻辑混乱、数据错乱;
- 多表联查时,所有未聚合的查询字段都要遵守规则,不止单表;
- 如果是MyBatis/JDBC后台代码,优先改SQL语句,不要动数据库全局配置。
更多推荐

所有评论(0)