mysql - 改进获取具有最大值的行的查询

标签 mysql sql max

我有下一张 table :

CREATE TABLE IF NOT EXISTS `Customers` (
    `id` INT AUTO_INCREMENT,
    `name` VARCHAR(20) NOT NULL,
    PRIMARY KEY(`id`)
);

CREATE TABLE IF NOT EXISTS `Orders` (
    `id` INT AUTO_INCREMENT,
    `id_cust` INT NOT NULL,
    `descr` VARCHAR(40),
    `price` INT NOT NULL,
    PRIMARY KEY(`id`),
    FOREIGN KEY(`id_cust`) REFERENCES `Customers`(`id`)
);

一个客户可以有多个订单。我想获取 id_cust 以及支付最多的人(一个人)的订单总和。 我的查询:

SELECT cust, max_orders_sum
FROM
(
    (
        SELECT MAX(orders_sum) AS max_orders_sum
        FROM (
            SELECT o.id_cust AS cust, SUM(o.price) AS orders_sum
            FROM Orders AS o
            GROUP BY o.id_cust
        ) AS same_query0
    ) AS step1
    INNER JOIN
    (
        SELECT o.id_cust AS cust, SUM(o.price) AS orders_sum 
        FROM Orders AS o
        GROUP BY o.id_cust
    ) AS same_query1
    ON (step1.max_orders_sum = same_query1.orders_sum)
);

主要问题: 如您所见,它具有相同的部分:same_query0same_query1。有什么办法可以摆脱它们吗? 或者,如果您知道实现我的目标的更好方法,请分享。 我找到了一个简单的解决方案:

SELECT o.id_cust AS cust, SUM(o.price) AS orders_sum
FROM Orders AS o
GROUP BY o.id_cust
ORDER BY orders_sum DESC LIMIT 1;

但这并不是解决问题的直接方法。

最佳答案

我认为你不能做得比你已经做的更好,除非你创建一个像

这样的 View
create view v_cust_tot as
select  id_cust, sum(price) as cust_tot
from    Orders
group by id_cust

这样您就可以像这样重写查询

select  id_cust, cust_tot
from    v_cust_tot
where   cust_tot = (select max(cust_tot) from v_cust_tot)

这只是查询紧凑性方面的改进,因为我认为性能将相同,因为执行计划几乎相同

关于mysql - 改进获取具有最大值的行的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42889971/

相关文章:

STL - 数组最大值或最小值的内置算法

python - 获取对象列表中具有最大属性值的对象

mysql - RDS MySQL、Kinesis Firehose 和 Elasticsearch,初始数据加载?

mysql - 将多行合并为一行

MySQL 查询具有最近日期的行

sql - 在默认文件组以外的文件组上创建表

mysql - 根据单词在数据库中出现的次数对单词进行排序,匹配相似的单词

mysql - 使用分组结果集获取 MySQL 查询的一列中具有最大值的行

mysql - Ruby on Rails 按周分组

regex - Perl:正则表达式的最大值?