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()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据