mysql的groupBy问题 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated

情景再现:


今天安装完8.0.16版本的Mysql,在写sql用的group by的时候报错。
报错:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'sky.orders.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

同样的SQL语句,在mysq8.0.16的数据库中报错,在5.7.5的mysql数据库中却正常。

分析

对于上述的报错信息,我在查阅资料后的理解是因为select字段里包含了没有被group by条件唯一确定的字段status。因为执行sql_make_group语句实际上把两行纪录选择一行进行输出,但搜索引擎不知道该返回哪一条,所以报错。

原因:

使用GROUP BY 语句违背了sql_mode=only_full_group_by。因为mysql版本5.7之后默认的模式是ONLY_FULL_GROUP_BY

查看官方文档,发现从 MySQL 5.7.5 开始,默认 SQL 模式包括 ONLY_FULL_GROUP_BY。 (在 5.7.5 之前,MySQL 不检测函数依赖,并且默认不启用 ONLY_FULL_GROUP_BY。)这可能会导致一些sql语句失效。

解决方法:

方法一(表面方法):

1、查询 sql_mode 

show variables like '%sql_mode%'

2、查看是否出现 ONLY_FULL_GROUP_BY

 3、去掉 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';

4、把当前会话的 sql_mode 也去掉

set session sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

注意这种方法一旦数据库服务重启就会失效 

方法二(根本方法):

执行命令修改配置文件,windows下是my.ini,Linux是my.cnf。

如果中有sql_mode配置,则将ONLY_FULL_GROUP_BY去掉。

如果没有,则将下面内容放到相应位置

[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

wq保存并退出

重启MySQL

service restart mysqld

已解决。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值