不同版本中的MySQL分组功能

不同版本中的MySQL分组功能,mysql,sql,aggregate-functions,mysql-error-1055,Mysql,Sql,Aggregate Functions,Mysql Error 1055,以下是一个简单的SQL查询: SELECT * FROM *table_name* GROUP BY *column_name* 在我的系统中,我有MySQL 5.5。它工作得非常好。 然而,在我朋友的系统中,他有MySQL 5.7,他得到以下错误: 错误1055 42000:选择列表的表达式1不在GROUP BY中 子句,并包含未聚合的列“testdb.assetentry.entryId” 功能上不依赖于GROUP BY子句中的列; 这与sql\u mode=only\u full\u g

以下是一个简单的SQL查询:

SELECT * FROM *table_name*
GROUP BY *column_name*
在我的系统中,我有MySQL 5.5。它工作得非常好。 然而,在我朋友的系统中,他有MySQL 5.7,他得到以下错误:

错误1055 42000:选择列表的表达式1不在GROUP BY中 子句,并包含未聚合的列“testdb.assetentry.entryId” 功能上不依赖于GROUP BY子句中的列; 这与sql\u mode=only\u full\u group\u by不兼容

很明显,这是因为版本不同

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


有人能解释一下吗。

首先,请阅读

这不是SQL的标准行为

要禁用MySQL分组扩展并启用标准SQL行为,请启用“唯一完整分组”SQL模式。在这种情况下,除非包含在聚合函数中,否则不能在select list或HAVING子句中使用GROUP BY子句中未命名的列

在第二台服务器上,您似乎只按模式激活了“完整”组

您可以在MySQL 5.5上模拟这种行为:

发件人:

通过SQL模式实现的唯一完整组已经做得更多了 复杂,不再拒绝 以前的申请被拒绝。因此,现在只有“满”组“到” 默认情况下启用,以禁止包含 表达式不保证在组中唯一确定


默认情况下,5.7上只启用了_FULL_GROUP_BY,这是一件好事,但会破坏很多旧的MySQLapplications@MichaelBerkowski谢谢,我把这个添加到answer@LukaszSzozda你能解释一下为什么它在最新版本的MySQL 8.0中不起作用吗?@sunil MySQL 8.0默认情况下也只启用了_FULL_GROUP_。您需要编写一个查询,使所有列都在GROUPBY中定义,或使用聚合函数包装。
SELECT @@sql_mode;
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY';

SELECT *
FROM tab
GROUP BY col;
-- tab.col2' isn't in GROUP BY