我有下一张 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_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;
但这并不是解决问题的直接方法。
最佳答案
我认为你不能做得比你已经做的更好,除非你创建一个像
这样的 Viewcreate 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/