2

問題の説明と私が使用している現在のコードを投稿して、クエリのパフォーマンスを向上させるための賢いアイデアがあるかどうか疑問に思っていますか? MySQL の使用。ありがとう。

スコアをランク付けする SQL クエリを記述します。2 つのスコアが同点の場合は、両方のランキングが同じである必要があります。同点の場合、次のランキング番号は次の連続する整数値にする必要があることに注意してください。つまり、ランク間に「穴」があってはなりません。

+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

たとえば、上記の Scores テーブルの場合、クエリは次のレポートを生成する必要があります (最高スコア順)。

+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

SELECT 
    s.score, scores_and_ranks.rank
FROM
    Scores s
JOIN
(
    SELECT 
        score_primary.score, COUNT(DISTINCT score_higher.score) + 1 AS rank
    FROM
        Scores score_primary
    LEFT JOIN Scores score_higher 
    ON score_higher.score > score_primary.score
    GROUP BY score_primary.score
) scores_and_ranks 
ON s.score = scores_and_ranks.score
ORDER BY rank ASC;

ところで、ゴードンのコードから問題を投稿してください。

ここに画像の説明を入力

ところで、sgeddes のコードを試してみましたが、新しい問題に遭遇しました。

ここに画像の説明を入力

ゴードンのコードからの新しい問題、

ここに画像の説明を入力

前もって感謝します、リン

4

2 に答える 2

2

ユーザー定義変数は、おそらくあなたがしていることよりも高速です。ただし、それらを使用する際には注意が必要です。特に、ある式で変数を代入して別の式で使用することはできません。つまり、できますが、式は任意の順序で評価できるため、コードが意図したとおりに動作しない場合があります。

したがって、単一の式ですべての作業を行う必要があります。

select s.*,
       (@rn := if(@s = score, @rn,
                  if(@s := score, @rn + 1, @rn + 1)
                 )
       ) as rank
from scores s cross join
     (select @rn := 0, @s := 0) params
order by score desc;
于 2015-12-09T02:33:48.390 に答える
1

1 つのオプションは、次を使用することuser-defined variablesです。

select score, 
       @rnk:=if(@prevScore=score,@rnk,@rnk+1) rnk,
       @prevScore:=score
from scores
     join (select @rnk:=0, @prevScore:=0) t
order by score desc
于 2015-12-09T01:53:11.800 に答える