SELECT list is not in GROUP BY clause and contains nonaggregated column
1 报错
MySQL 8.0.22
GROUP BY 语句执行报错:
1055 - Expression #22 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxx.xxx.xxx' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by, Time: 0.000000s
2 原因
MySQL 8.0.22 默认启用了 ONLY_FULL_GROUP_BY SQL模式(select @@sql_mode);
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
MySQL 5.7.5以上版本,实现了对功能依赖的检测。如果启用了only_full_group_by SQL模式(默认启用),那么MySQL就会拒绝执行 select list、HAVING condition或ORDER BY list引用既不在GROUP BY子句中被命名,也不在功能上依赖于GROUP BY列(由GROUP BY列唯一确定)的未聚合列的查询。
从MySQL5.7.5开始,默认的SQL模式包括only_full_group_by。(在5.7.5之前,MySQL没有检测到功能依赖项,only_full_group_by在默认情况下是不启用的。关于前5.7.5行为的描述,请参阅MySQL 5.6参考手册。)
MySQL :: MySQL 5.7 Reference Manual :: 5.1.10 Server SQL Modes
3 解决办法
(1)执行以下两个命令,去掉 sql_mode 的 ONLY_FULL_GROUP_BY
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
(2)my.cnf (Mac、linux)或my.ini(Windows)文件中添加如下设置(避免mysql服务重启后上述设置失效):
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
注意:
1、如果后端项目正在使用数据库,则设置后重启后端项目,使项目运行正常
2、linux上查看my.cnf位置
命令:
mysql --help|grep 'my.cnf'
从前到后的顺序:
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf
上述命令查看mysql默认读取的my.cnf,按照从前到后的优先级排序,前面的不存在,则读取后面的。通常配置在 /etc/my.cnf。