项目中本来使用的是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