ホームページ >データベース >mysql チュートリアル >MySQL でサブクエリと変数を使用してグループ化されたランキングを実行する方法
データベース管理者は、グループ化されたデータセット内の項目をランク付けする必要がある場合があります。 MySQL は、サブクエリと一時変数の組み合わせを使用して、グループ化されたランキングを実行する便利な方法を提供します。
次の形式を考えてみましょう:
ID_STUDENT | ID_CLASS | GRADE |
---|---|---|
1 | 1 | 90 |
1 | 2 | 80 |
2 | 1 | 99 |
3 | 1 | 80 |
4 | 1 | 70 |
5 | 2 | 78 |
6 | 2 | 90 |
6 | 3 | 50 |
7 | 3 | 90 |
目標は、各クラス内で生徒をランク付けすることです。その結果、次のような出力が得られます:
ID_STUDENT | ID_CLASS | GRADE | RANK |
---|---|---|---|
2 | 1 | 99 | 1 |
1 | 1 | 90 | 2 |
3 | 1 | 80 | 3 |
4 | 1 | 70 | 4 |
6 | 2 | 90 | 1 |
1 | 2 | 80 | 2 |
5 | 2 | 78 | 3 |
7 | 3 | 90 | 1 |
6 | 3 | 50 | 2 |
MySQL でグループのランキングを実行するには、次のクエリを使用できます:
<code class="language-sql">SELECT id_student, id_class, grade, @student:=CASE WHEN @class = id_class THEN @student+1 ELSE 0 END AS rn, @class:=id_class AS clset FROM (SELECT @student:= -1, @class := -1) s, (SELECT * FROM mytable ORDER BY id_class, grade DESC ) t;</code>
このクエリはステップバイステップです:
id_class
で並べ替え、次に grade
で降順に並べ替えます。 @student
と @class
は -1 に初期化されます。 @class
は、新しいグループに参加するかどうかを決定するために使用されます。 @class
に格納されている id_class
の以前の値が現在の id_class
と異なる場合、@student
は 0 にリセットされます。それ以外の場合はインクリメントされます。 @class
には id_class
の新しい値が割り当てられ、クエリの次の反復で使用されます。 rn
が計算されます。 正しいランキングを確保するには、内部クエリを id_class
と grade
で降順に並べ替える必要があることに注意してください。 この変更されたクエリは、変数を使用してグループのランキングを達成する方法をより明確に示し、元のクエリのいくつかの論理エラーを修正してランキング結果の正確性を保証します。 鍵となるのは、CASE WHEN
ステートメントの条件判断と、@student
変数と @class
変数の正しい更新です。
以上がMySQL でサブクエリと変数を使用してグループ化されたランキングを実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。