解决MYSQL 1055:ONLY_FULL_GROUP_BY报错问题

项目场景:


项目部署到现场服务器,开发环境没有出现的问题服务器出现mysql1055的问题

问题描述

Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘t0.type’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by


原因分析:

大致一看好像没啥问题,但是不然,是由于5.7以上版本默认的 MySQL 配置中 sql_mode 配置了 ONLY_FULL_GROUP_BY,而且默认打开了的,在select 中出现的字段都必须出现在group by 后面(select中聚合函数可以不用)
原本语句:select A.,B from xx group by A 会出现上面的1055错误
5.7版本一下并不会出现这个错误(我的开发环境用的5.6),但是服务器环境用的5.8(出现这个问题)
真正原因就是因为5.7以上版本 开启了ONLY_FULL_GROUP_BY这个 规则用来检验我们的语句的规范,总的 这个规则中,target list中的值来自于聚合函数(sum、avg、max,min等)的结果,或者来源于 group by xx中的表达式的值


解决方案:

方法一:降低mysql版本(太扯了,不能这么做有风险我问题,真实服务环境版本不能随便降)

方法二:关闭only_full_group_by规则

在安装目录下找到 my.ini
在[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'

然后保存文件重启数据库
可以检查一下 SELECT @@GLOBAL.sql_mode;
ONLY_FULL_GROUP_BY 验证规则去掉了

方法三:MySQL提供了any_value()函数—到同一组的数据里第一条数据的指定列值作为返回数据

SELECT  A,any_value ( B) AS B ,any_value ( C ) AS C,sum(D) as D  FROM XX  GROUP BY A

方法四:解决sql的不规范,让语句规范化,如果在 大量语句的情况下选择符合需求的办法,结合逻辑避免问题

其实版本高的应该是修复了许多问题,让sql更加规范,但是也可能会带来一些跨版本的问题,多多注意一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值