我正在尝试稍微优化我的查询,但不能完全正确。
我希望从表格中获取一些统计信息
我要查询主要贡献者
SELECT `name`, `amount` FROM `customers` ORDER by `amount` DESC LIMIT 10
但我也想获得所有记录中金额的 SUM 和 AVG,而不仅仅是前 10 名。我不确定如何在没有新查询的情况下执行此操作。
尝试
SELECT `name`, `amount`, sa.sum_a, sa.avg_a
FROM `customers`, (select sum(amount) as sum_a, avg(amount) as avg_a from customers) sa
ORDER by `amount` DESC
LIMIT 10
如果您想要前 10 个用户以及表中所有SUM
行的和,您可以制作和的笛卡尔积,如下所示:AVG
SUM
AVG
SELECT
a.name, a.amount, b.amtsum, b.amtavg
FROM customers a
CROSS JOIN (SELECT SUM(amount) AS amtsum, AVG(amount) AS amtavg FROM customers) b
ORDER BY amount DESC
LIMIT 10
请记住, 和 的值SUM
将AVG
在返回的所有 10 行上重复——它们将是相同的。
如果您想要每个用户的金额总和和平均值,您可以执行以下操作:
SELECT a.name, a.amount, b.amtsum, b.amtavg
FROM customers a
INNER JOIN
(
SELECT name, SUM(amount) AS amtsum, AVG(amount) AS amtavg
FROM customers
GROUP BY name
) b ON a.name = b.name
ORDER BY a.amount DESC
LIMIT 10
一种选择是使用子查询
SELECT
`name`, `amount`,
(SELECT SUM(amount) FROM customers) as summation,
(SELECT AVG(amount) FROM customers) as average
FROM
`customers` ORDER by `amount` DESC LIMIT 10
在这种情况下,最干净且通常也是最快的方法是两个查询。获取相同的聚合十次没有任何优势。
确保您在amount
. 这将为您节省每个查询对表的完整排序。
您可以使用 MySQLExplain
关键字进行查询优化。
更多详情您可以点击这里