首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL 8.0 GROUP BY / FULL_GROUP_BY

MySQL 8.0 GROUP BY / FULL_GROUP_BY
EN

Stack Overflow用户
提问于 2019-02-08 05:12:14
回答 1查看 406关注 0票数 1

自从升级到MySQL 8后,我有很多查询不符合新的MySQL全分组设置。下面是其中一个查询的简化版本。我有很多这样的代码,在浏览所有代码之前,我想要完全了解问题所在。

我在数据库中有以下记录:

代码语言:javascript
运行
复制
[prod_id] => 1
[prod_name] => Product 1
[prod_new] => 50.00
[prod_size] => L

[prod_id] => 2
[prod_name] => Product 1
[prod_new] => 45.00
[prod_size] => M

[prod_id] => 3
[prod_name] => Product 1
[prod_new] => 40.00
[prod_size] => S

[prod_id] => 4
[prod_name] => Product 4
[prod_new] => 100.00
[prod_size] => M

[prod_id] => 5
[prod_name] => Product 5
[prod_new] => 200.00
[prod_size] => M

当我在MySQL 5.x中运行以下查询时,我得到了3个结果。包含产品1、4、5,并有相应的名称、价格和尺寸。

代码语言:javascript
运行
复制
SELECT prod_id, prod_name, prod_price, prod_size 
FROM prod_product
GROUP BY prod_name

自从升级以来,我得到了关于非聚合列的广为人知的错误。所以我想解决这个问题,但在某些情况下,这会得到不想要的结果。假设,出于某种原因,我想要最高的product-id。

代码语言:javascript
运行
复制
SELECT MAX(prod_id), prod_name, ANY_VALUE(prod_price), ANY_VALUE(prod_size)
FROM prod_product
GROUP BY prod_name

这将得到product-id为3,4,5。但是使用product-id 3,它给出了product-id为1的价格和大小。

显然,这是不受欢迎的行为。我假设,因为prod_id是主键,所以数据库知道用相应的id显示哪些值。当我说MAX(prod_id) this已经定位了这个组中的一条记录时,为什么要给我这个组中其他记录的值呢?

我想我遗漏了一些重要的东西。=)

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-02-08 05:40:29

我假设,因为prod_id是主键,所以数据库知道用相应的id显示哪些值。

它为什么会知道呢?

考虑以下查询:

代码语言:javascript
运行
复制
SELECT prod_name, prod_id, MIN(prod_price), MAX(prod_price)
FROM prod_product
GROUP BY prod_name

它应该在这里为prod_id返回哪个值?最低价格对应的产品是什么?还是与最高价格对应的产品?

另外,如果有多个产品的最低或最高价格相同,该怎么办?它应该返回哪一个?

代码语言:javascript
运行
复制
SELECT prod_name, prod_id, AVG(prod_price)
FROM prod_product
GROUP BY prod_name

现在,它应该推断出哪个prod_id?聚合计算AVG()可能会返回一个与任何单个产品都不对应的值。

聚合SUM()也是如此。

事实是,聚合函数和组中的特定行之间没有隐式关联。在使用非聚合表达式时,不应期望SQL猜测要引用组中的哪一行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54582364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档