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

时间:2017-03-19 17:45:56

标签: mysql sql max

我有下表:

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;

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

2 个答案:

答案 0 :(得分:0)

除非你创建一个像

这样的视图,否则我认为你不能比你已经做的更好。
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)

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

答案 1 :(得分:0)

另一个不错的解决方案:

select id_cust, sum(price) from orders group by id_cust having sum(price) = 
(select max(prc) from
(select sum(price) as prc from orders group by id_cust) as tb);