以下是一个简单的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
不兼容
很明显,这种情况正在发生,因为版本不同。
但我想知道的是背后的原因。
任何人都可以解释一下。
答案 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 默认情况下启用,禁止包含的非确定性查询 表达式不能保证在组内唯一确定。