クエリを少し最適化しようとしていますが、うまくいきません。
テーブルからいくつかの統計を取得しようとしています
トップコントリビューターについて質問があります
SELECT `name`, `amount` FROM `customers` ORDER by `amount` DESC LIMIT 10
しかし、上位10件だけでなく、すべてのレコードの金額のSUMとAVGも取得したいと考えています。それぞれに新しいクエリを作成せずにこれを行う方法がわかりません。
試す
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
テーブル内のすべてSUM
の行のandとともに上位 10 人のユーザーが必要な場合は、次のようにandのデカルト積を作成できます。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
Explain
クエリの最適化に MySQL キーワードを使用できます。
詳細については、ここをクリックしてください。
この場合、最もクリーンで通常は最速の方法は、2 つのクエリです。同じ集計を 10 回フェッチしてもメリットはありません。
に索引があることを確認してくださいamount
。これにより、クエリごとにテーブルを完全に並べ替える必要がなくなります。
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