提问者:小点点

使用GROUP_BY和ONLY_FULL_GROUP_BY的解释查询


我想了解查询在只启用了FULLGROUPBY的情况下是如何工作的。

如果我列出表的所有列,其中一列上有一个MIN(),那么它可以正常工作:

$query = "SELECT id, member_id, name, code, MIN(price) AS price, FROM tbl_product GROUP BY code";

但如果我选择了所有内容,就会出现错误:

$query = "SELECT *, MIN(price) AS price FROM tbl_product GROUP BY code";

你能给我解释一下两者的区别吗?


共2个答案

匿名用户

这是关于MySQL5.7.5中修复的一个bug。 根据MySQL手册12.20.3,MySQL5.7.5和更新版本对GROUP的处理可以检测主键和表的其余列之间的函数依赖性。 字面意思是:

MySQL5.7.5和更高版本实现了函数依赖性的检测。 如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下是这样),则MySQL会拒绝select列表,HAVING条件或ORDER by列表引用非聚合列的查询,这些列既不在GROUP by子句中命名,也不在功能上依赖于它们。

only_full_group_by现在是默认选项,按照SQL标准指定的方式工作。

匿名用户

问题是为什么认为group by可以与select*一起使用。

group by所做的是为group by键的每个值组合生成一行。 这是根据定义。 多行变成一行。

select中允许的表达式如下:

  • group by键或仅包含这些键的表达式。
  • 其他值的摘要函数。
  • 摘要函数与group by键的组合。

select中不在group by中的任何列都可能在原始行中具有多个值。 SQL不允许这样做。 大多数数据库不允许这样做。 默认情况下,MySQL不再允许这样做。

很久以前,它确实是这样做的,但返回的值来自不确定的匹配行。 这个“功能”(实际上是一个bug)现在已经被修复了。

注意:有一个例外--这是标准允许的--允许按主键/唯一键聚合,然后选择其余的列。 这是允许的,因为主键唯一地标识其余的列值。