MySQL5.7 group by报错1055

项目中本来使用的是mysql5.6进行开发,切换到5.7之后,突然发现原来的一些sql运行都报错,错误编码1055,

语法如下

SELECT DISTINCT a.attr_one, a.attr_two, a.attr_three, b.attr_four FROM table_one a
LEFT JOIN table_two b ON b.some_idx = a.idx
ORDER BY b.id_order

在大多数情况下,DISTINCT子句可以被认为是GROUP BY的特殊情况。例如,

ONLY_FULL_GROUP_BY

MySQL 5.7.5及以上功能依赖检测功能。如果启用ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。5.7.5之前,MySQL没有检测到功能依赖关系,默认情况下不启用ONLY_FULL_GROUP_BY。有关5.7.5之前的描述

如果ONLY_FULL_GROUP_BY被禁用,则使用GROUP BY的标准SQL的MySQL扩展允许选择列表,HAVING条件或ORDER BY列表引用非集合列,即使这些列在功能上不依赖于GROUP BY列。这将导致MySQL接受前面的查询。在这种情况下,服务器可以自由选择每个组中的任何值,因此除非它们是相同的,所选择的值是不确定的,这可能不是您想要的。此外,通过添加ORDER BY子句不会影响来自每个组的值的选择。结果集排序发生在选择值后,ORDER BY不影响服务器选择的每个组中的哪个值。禁用ONLY_FULL_GROUP_BY主要是因为您知道,由于数据的某些属性,

更多http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

不想修改 ONLY_FULL_GROUP_BY又能继续使用的方法 可以将MySQL修改如下

SELECT DISTINCT attr_one,
            attr_two,
            attr_three,
            attr_four
FROM
  (SELECT a.attr_one,
      a.attr_two,
      a.attr_three,
      b.attr_four
   FROM table_one a
   LEFT JOIN table_two b ON b.some_idx = a.idx
   ORDER BY b.id_order) tmp


错误信息和sql_mode中的“only_full_group_by“有关,到网上看了原因,说是mysql5.7中only_full_group_by这个模式是默认开启的 

查看sql_mode用如下语句

SELECT @@sql_mode 


小心使用

mysql > SET sql_mode = ''

这实际上清除了当前启用的所有模式。如果你不想混淆其他设置

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));


只将一个模式添加到sql_mode而不删除现有模式:

SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));

仅从sql_mode中删除特定模式而不删除其他模式:

SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));
在目前的情况下,如果要仅删除ONLY_FULL_GROUP_BY模式,请使用以下命令:

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

参考文章地址

https://stackoverflow.com/questions/23921117/disable-only-full-group-by

http://johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值