下面是一个简单的SQL查询:
SELECT * FROM *table_name*
GROUP BY *column_name*
在我的系统中,我有MySQL 5.5。它运行得非常好。而在我朋友的系统中,他有MySQL 5.7,他得到了以下错误:
错误1055(42000):SELECT列表的表达式#1不在GROUP BY中子句,并包含非聚合列"testdb.assettentry.entryId"它在功能上不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by 不兼容
这是显而易见的,因为版本不同。
但我想知道的是这背后的原因。
谁能解释一下吗。
首先,请阅读mySQL和postgreSQL中的Group by子句,为什么postgreSQL出现错误?
这不是SQL标准行为。
12.16.3 对GROUP的MySQL处理
若要禁用MySQL GROUP BY扩展并启用标准SQL行为,请启用ONLY_FULL_GROUP _BY SQL模式。在这种情况下,除非包含在聚合函数中,否则不能在选择列表或HAVING子句中使用GROUP BY子句中未命名的列。
在第二台服务器上,您似乎已经激活了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现在默认情况下启用,以禁止包含表达式不能保证在组内唯一确定