以下是一个简单的SQL查询:
SELECT * FROM *table_name* GROUP BY *column_name*
在我的系统中,我有MySQL 5.5。它工作正常。而在我朋友的系统中,他拥有MySQL 5.7,并且遇到以下错误:
错误1055(42000):SELECT列表的表达式#1不在GROUP BY子句中,并且包含未聚合的列’testdb.assetentry.entryId’,该列在功能上不依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by不兼容
可以清楚地看到这是由于版本不同而发生的。
但是我想知道的是这背后的原因。
谁能解释一下。
这不是SQL标准的行为。
12.16.3 MySQL对GROUP BY的处理 要禁用MySQL GROUP BY扩展并启用标准SQL行为,请启用ONLY_FULL_GROUP_BY SQL模式 。在这种情况下,除非包含在聚合函数中,否则不能在选择列表或HAVING子句中使用GROUP BY子句中未命名的列。
12.16.3 MySQL对GROUP BY的处理
要禁用MySQL GROUP BY扩展并启用标准SQL行为,请启用ONLY_FULL_GROUP_BY SQL模式 。在这种情况下,除非包含在聚合函数中,否则不能在选择列表或HAVING子句中使用GROUP BY子句中未命名的列。
看起来在第二台服务器上您具有激活ONLY_FULL_GROUP_BY模式。
ONLY_FULL_GROUP_BY
SELECT @@sql_mode;
您可以在以下行为上模拟这种行为MySQL 5.5:
MySQL 5.5
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY'; SELECT * FROM tab GROUP BY col; -- tab.col2' isn't in GROUP BY
**[SqlFiddleDemo](http://sqlfiddle.com/#!9/558433/3/2)**
**[
](http://sqlfiddle.com/#!9/558433/3/2)**
从MySQL 5.7:
已经使ONLY_FULL_GROUP_BY SQL模式的实现更加复杂,不再拒绝以前被拒绝的确定性查询。 因此,现在默认情况下启用ONLY_FULL_GROUP_BY,以禁止包含不确定保证在组内唯一确定的表达式的不确定查询。