MySql 5.7 报错 sql_mode=only_full_group_by 问题解决方法

mysql 5.7 以上版本中sql_mode默认开启了 ONLY_FULL_GROUP_BY,ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在此模式下,target list中的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于group by list中的表达式的值;但在老代码中有很多group by 查询所有字段的,所以需要关闭该模式

关闭方法如下

1、查看sql_mode


select @@global.sql_mode

# 得到结果
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER
,NO_ENGINE_SUBSTITUTION

2、去掉ONLY_FULL_GROUP_BY,重新设置值。

# 将上面结果中 `ONLY_FULL_GROUP_BY,` 去掉,配置到mysql配置文件中,配置方式如下
vim /etc/my.cnf

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER
,NO_ENGINE_SUBSTITUTION

3、重启数据库即可

解决方法二

MySQL提供了any_value()函数来抑制ONLY_FULL_GROUP_BY值被拒绝

在sql查询语句中不需要group by的字段上使用any_value()函数

实例:

# 在不在GROUP BY中的字段上添加any_value方法

SELECT cust_id, ANY_VALUE(cust_last_name), SUM(amount_sold) FROM customers GROUP BY cust_id;

any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据