0

我正在尝试稍微优化我的查询,但不能完全正确。

我希望从表格中获取一些统计信息

我要查询主要贡献者

SELECT `name`, `amount` FROM `customers` ORDER by `amount` DESC LIMIT 10

但我也想获得所有记录中金额的 SUM 和 AVG,而不仅仅是前 10 名。我不确定如何在没有新查询的情况下执行此操作。

4

5 回答 5

1

尝试

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
于 2012-07-13T06:51:46.180 回答
1

如果您想要前 10 个用户以及表中所有SUM行的和,您可以制作和的笛卡尔积,如下所示:AVGSUMAVG

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

请记住, 和 的值SUMAVG在返回的所有 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
于 2012-07-13T06:51:47.197 回答
0

一种选择是使用子查询

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 
于 2012-07-13T06:53:00.613 回答
0

在这种情况下,最干净且通常也是最快的方法是两个查询。获取相同的聚合十次没有任何优势。

确保您在amount. 这将为您节省每个查询对表的完整排序。

于 2012-07-13T06:58:18.873 回答
0

您可以使用 MySQLExplain关键字进行查询优化。

更多详情您可以点击这里

于 2012-07-13T08:02:24.923 回答