目录
原因
这个错误通常出现在使用SQL查询时,尤其是在使用聚合函数(如SUM, COUNT, AVG等)的同时,也选择了非聚合列,并且没有遵循MySQL的严格模式(STRICT_TRANS_TABLES或STRICT_ALL_TABLES),或者是在使用了严格模式的SQL标准兼容性模式下。在严格模式下,如果SELECT语句中包含聚合函数,而在GROUP BY子句中没有列出所有非聚合列,MySQL会抛出这个错误。
SELECT 列表的表达式结果不在 GROUP BY 子句中,或者 GROUP BY 子句中值和结果不匹配
如下图列表是四个值但是group by只有一个值这种情况:
解决方法:
临时方案
查询sql_mode:
sql客户端执行下面语句:
select @@session.sql_mode;
查出的值,删除ONLY_FULL_GROUP_BY,或者直接使用下面sql重新设置sql_mode
set @@global.sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
但是此方法mysql重启后可能会恢复
永久方法
找到my.cnf,修改配置文件my.cnf
Windows操作系统中的MySQL配置文件是“my.ini”,位置一般在MySql安装的根目录下,也有可能在隐藏文件夹“ProgramData”下面;而Linux操作系统中的MySQL配置文件是“my.cnf”,位置一般在“/etc/my.cnf”或“/etc/mysql/my.cnf”目录下
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
重启mysql即可。
service mysqld restart