最近在和一个合作伙伴的系统对接时,发现他们的系统跑在我们的环境里时,数据库报了个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
a 1 c
a 2 c
select f1,max(f2),f3 from t group by f3
返回
a 2 c
如果换成下面的数据
f1 f2 f3
a1 1 c
a2 2 c
select f1,max(f2),f3 from t group by f3
那么f1这一列应该返回哪个值呢?a1?a2?是不是好像都不对?这就是官方所说的
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呢?