0

クエリを少し最適化しようとしていますが、うまくいきません。

テーブルからいくつかの統計を取得しようとしています

トップコントリビューターについて質問があります

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

しかし、上位10件だけでなく、すべてのレコードの金額のSUMとAVGも取得したいと考えています。それぞれに新しいクエリを作成せずにこれを行う方法がわかりません。

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

テーブル内のすべてSUMの行のandとともに上位 10 人のユーザーが必要な場合は、次のようにandのデカルト積を作成できます。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

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
于 2012-07-13T06:51:47.197 に答える
0

Explainクエリの最適化に MySQL キーワードを使用できます。

詳細については、ここをクリックしてください。

于 2012-07-13T08:02:24.923 に答える
0

この場合、最もクリーンで通常は最速の方法は、2 つのクエリです。同じ集計を 10 回フェッチしてもメリットはありません。

に索引があることを確認してくださいamount。これにより、クエリごとにテーブルを完全に並べ替える必要がなくなります。

于 2012-07-13T06:58:18.873 に答える
0

1 つのオプションは、サブクエリを使用することです

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 に答える