我有下表:
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_query0
和same_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;
但这不是解决问题的直接方法。
答案 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);