我想了解查询在只启用了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";
你能给我解释一下两者的区别吗?
这是关于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
中允许的表达式如下:
select
中不在group by
中的任何列都可能在原始行中具有多个值。 SQL不允许这样做。 大多数数据库不允许这样做。 默认情况下,MySQL不再允许这样做。
很久以前,它确实是这样做的,但返回的值来自不确定的匹配行。 这个“功能”(实际上是一个bug)现在已经被修复了。
注意:有一个例外--这是标准允许的--允许按主键/唯一键聚合,然后选择其余的列。 这是允许的,因为主键唯一地标识其余的列值。