mysql 5.7 only_full_group_by到底是该改配置,还是改sql?

最近在和一个合作伙伴的系统对接时,发现他们的系统跑在我们的环境里时,数据库报了个only_full_group_by的错,由于我们一直用的是mysql5.7,这是个很熟悉的错误,就是因为select 后面的字段和group的字段不对应。mysql5.7之后,only_full_group_by这个是默认配置,和对方解释后,最终他们还是选择了修改配置文件来解决,我也只能呵呵了。

如果只是暂时解决这个错误,可以修改配置,网上随便查一下,都是来改mysql的配置,最后不报错了,万事大吉。

为什么mysql选择了默认启用这个选项,故意给大家找麻烦吗?当然不是,仔细想一下,就会发现,其实是我们写的sql有问题,mysql只是帮我们提前检测出来了,你可以选择改或者不改,那是你的事,所以mysql允许你修改配置来规避这个检测。

那么sql到底出了什么问题?先看下官方的解释

If ONLY_FULL_GROUP_BY is disabled, a MySQL extension to the standard SQL use of GROUP BY permits the select list, HAVING condition, or ORDER BY list to refer to nonaggregated columns even if the columns are not functionally dependent on GROUP BY columns. This causes MySQL to accept the preceding query. In this case, the server is free to choose any value from each group, so unless they are the same, the values chosen are nondeterministic, which is probably not what you want. 

大致意思就是,如果ONLY_FULL_GROUP_BY是禁用状态,msyql允许在select后面的非聚合字段和group by后面的不一一对应。在这种情况下,服务器可以自由地从每个组中选择任何值,因此,除非它们是相同的,否则所选择的值是不确定的,这可能不是您想要的。

举个例子,f1,f2,f3三个字段 
f1       f2      f3
a1       1       c
a2       2       c

select f1,max(f2),f3 from t group by f3
返回
a2     2      c

如果换成下面的数据
f1      f2      f3
a1      1       c
a2      2       c
a3      2       c

select f1,max(f2),f3 from t group by f3

那么f1这一列应该返回哪个值呢?a2?a3?是不是好像都不对?这就是官方所说的
In this case, the server is free to choose any value from each group, so unless they are the same, the values chosen are nondeterministic, which is probably not what you want. 

这个结果可能不是你想要的,因为不确定。

所以,各位童鞋再碰到这个错误,不要只去改配置,要看看你的sql是不是有问题了,之前还经常碰到,为了去重,用group by,想想,如果去重,是不是该去用distinct呢?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值