如何在 MySQL 查询中找到最大总和的关联名称?
How do I find the associated name of a max of a sum in a MySQL query?
我这里有这个架构,我需要找到订单总额最高的客户的姓名。我在这里有一个 SQL 查询:
SELECT Name
FROM (SELECT Name, SUM(Amount) AS Total
FROM customer JOIN orders ON cust_id = ID
GROUP BY Name) AS Totals
WHERE Total = (SELECT MAX(Total)
FROM (SELECT Name, SUM(Amount) AS Total
FROM customer JOIN orders ON cust_id = ID
GROUP BY Name) AS X);
但这非常低效,因为它创建了相同的 table 两次。有没有更高效的取名方式?
如果你想要总挂载量最大的客户,那么你可以加入,排序和限制:
select c.name
from customer c
inner join orders o on o.cust_id = c.id
group by c.id, c.name
order by sum(o.amount) desc
limit 1
请注意,这不会处理可能的顶级关系。为此,您需要多一点代码。您通常会使用 having
子句过滤而不是排序:
select c.name
from customer c
inner join orders o on o.cust_id = c.id
group by c.id, c.name
having sum(o.amount) = (
select sum(o1.amount)
from orders o1
group by cust_id
order by sum(o1.amount) desc
limit 1
)
最后:如果您是 运行 MySQL 8.0,使用 window 函数 rank()
:
会更简单
select name
from (
select c.name, rank() over(order by sum(o.amount) desc) rn
from customer c
inner join orders o on o.cust_id = c.id
group by c.id, c.name
) t
where rn = 1
我这里有这个架构,我需要找到订单总额最高的客户的姓名。我在这里有一个 SQL 查询:
SELECT Name
FROM (SELECT Name, SUM(Amount) AS Total
FROM customer JOIN orders ON cust_id = ID
GROUP BY Name) AS Totals
WHERE Total = (SELECT MAX(Total)
FROM (SELECT Name, SUM(Amount) AS Total
FROM customer JOIN orders ON cust_id = ID
GROUP BY Name) AS X);
但这非常低效,因为它创建了相同的 table 两次。有没有更高效的取名方式?
如果你想要总挂载量最大的客户,那么你可以加入,排序和限制:
select c.name
from customer c
inner join orders o on o.cust_id = c.id
group by c.id, c.name
order by sum(o.amount) desc
limit 1
请注意,这不会处理可能的顶级关系。为此,您需要多一点代码。您通常会使用 having
子句过滤而不是排序:
select c.name
from customer c
inner join orders o on o.cust_id = c.id
group by c.id, c.name
having sum(o.amount) = (
select sum(o1.amount)
from orders o1
group by cust_id
order by sum(o1.amount) desc
limit 1
)
最后:如果您是 运行 MySQL 8.0,使用 window 函数 rank()
:
select name
from (
select c.name, rank() over(order by sum(o.amount) desc) rn
from customer c
inner join orders o on o.cust_id = c.id
group by c.id, c.name
) t
where rn = 1