MySQL Group By功能在不同的版本中

时间:2016-05-03 17:12:34

标签: mysql sql aggregate-functions mysql-error-1055

以下是一个简单的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

不兼容

很明显,这种情况正在发生,因为版本不同。

但我想知道的是背后的原因。

任何人都可以解释一下。

1 个答案:

答案 0 :(得分:5)

首先,请阅读Group by clause in mySQL and postgreSQL, why the error in postgreSQL?

这不是SQL标准行为。

  

12.16.3 MySQL Handling of GROUP BY

     

要禁用MySQL GROUP BY扩展并启用标准SQL行为,请启用ONLY_FULL_GROUP_BY SQL模式。在这种情况下,GROUP BY子句中未命名的列不能在选择列表或HAVING子句中使用,除非包含在聚合函数中。

在第二台服务器上看起来您已经激活了ONLY_FULL_GROUP_BY模式。

SELECT @@sql_mode;

您可以在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

来自MySQL 5.7

  

ONLY_FULL_GROUP_BY SQL模式的实现已经做得更多   复杂的,不再拒绝那些确定性的查询   以前被拒绝了。 结果,现在ONLY_FULL_GROUP_BY   默认情况下启用,禁止包含的非确定性查询   表达式不能保证在组内唯一确定。