Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用GROUP\ U BY和ONLY\ U FULL\ U GROUP\ U BY的解释查询_Mysql_Sql - Fatal编程技术网

Mysql 使用GROUP\ U BY和ONLY\ U FULL\ U GROUP\ U BY的解释查询

Mysql 使用GROUP\ U BY和ONLY\ U FULL\ U GROUP\ U BY的解释查询,mysql,sql,Mysql,Sql,我想了解查询如何仅在启用了_FULL _GROUP _BY的情况下工作 如果我在一列中列出表中的所有列,并在其中添加一个MIN(),则效果良好: $query = "SELECT id, member_id, name, code, MIN(price) AS price, FROM tbl_product GROUP BY code"; 但如果我选择了所有内容,则会出现错误: $query = "SELECT *, MIN(price) AS price FRO

我想了解查询如何仅在启用了_FULL _GROUP _BY的情况下工作

如果我在一列中列出表中的所有列,并在其中添加一个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";

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

这是关于MySQL 5.7.5中修复的一个bug。根据手册,MySQL 5.7.5及更新版本可以检测主键和表中其他列之间的函数依赖关系。字面上说:

MySQL 5.7.5及以上版本实现了功能依赖性检测。如果启用了“唯一完整”的“按SQL分组”模式(默认情况下),MySQL将拒绝select list、HAVING condition或ORDER BY list引用的未聚合列的查询,这些列既不在GROUP BY子句中命名,也不在功能上依赖于它们


ONLY\u FULL\u GROUP\u BY
现在是默认选项,按照SQL标准的规定工作。

这是关于MySQL 5.7.5中修复的一个错误。根据手册,MySQL 5.7.5及更新版本可以检测主键和表中其他列之间的函数依赖关系。字面上说:

MySQL 5.7.5及以上版本实现了功能依赖性检测。如果启用了“唯一完整”的“按SQL分组”模式(默认情况下),MySQL将拒绝select list、HAVING condition或ORDER BY list引用的未聚合列的查询,这些列既不在GROUP BY子句中命名,也不在功能上依赖于它们


ONLY\u FULL\u GROUP\u BY
现在是默认选项,并按照SQL标准的规定工作。

问题是,为什么您会认为
GROUP BY
可以与
select*
一起工作

groupby
所做的是为
groupby
键的每个值组合生成一行。这就是定义。多行变成一行

select
中允许的表达式如下:

  • 分组依据键或仅包含这些键的表达式
  • 其他值的摘要函数
  • 摘要函数与分组键的组合
select
中任何不在
groupby
中的列在原始行中都可能有多个值。SQL不允许这样做。大多数数据库不允许这样做。默认情况下,MySQL不再允许这样做

曾经有过,但返回的值来自不确定的匹配行。这个“功能”(实际上是一个bug)现在已经修复


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

问题是,为什么您会认为
分组依据
可以与
选择*
一起使用

groupby
所做的是为
groupby
键的每个值组合生成一行。这就是定义。多行变成一行

select
中允许的表达式如下:

  • 分组依据键或仅包含这些键的表达式
  • 其他值的摘要函数
  • 摘要函数与分组键的组合
select
中任何不在
groupby
中的列在原始行中都可能有多个值。SQL不允许这样做。大多数数据库不允许这样做。默认情况下,MySQL不再允许这样做

曾经有过,但返回的值来自不确定的匹配行。这个“功能”(实际上是一个bug)现在已经修复


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

数据库是什么?是MySQL吗?数据库是什么?是MySQL吗?