MySQL グループランキングの詳細説明
一部のシナリオでは、単一フィールドのみに依存するのではなく、グループ化に基づいてデータをランク付けする必要があります。たとえば、次のような学生 ID、クラス ID、成績を含む学生テーブルがあるとします。
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 |
<code class="language-sql">SELECT id_student, id_class, grade, @student:=CASE WHEN @class = id_class THEN @student+1 ELSE 1 END AS rn, @class:=id_class AS clset FROM (SELECT @student:= 0) s, (SELECT @class:= 0) c, (SELECT * FROM mytable ORDER BY id_class, grade DESC, id_student ) t</code>
変数の初期化: 2 つのユーザー変数 と @student
は 0 に初期化されます。 @class
行ごとの処理: 外側のクエリは、 句 (ORDER BY
、id_class
、grade DESC
) で指定された順序で結果セットの各行を処理します。 ここでの並べ替えには id_student
が使用されており、スコアの高い生徒が最初にランク付けされるようになっていることに注意してください。 grade DESC
グループ内ランキング: ステートメントは、現在の CASE
が前の id_class
(id_class
) と同じかどうかをチェックします。同じ場合は @class
に 1 を追加し、そうでない場合は @student
を 1 にリセットします。これにより、@student
値 (ランク) が各グループ (rn
) 内で一意であることが保証されます。 id_class
グループ化された割り当て: には現在の @class
が割り当てられ、次の行で比較されます。 id_class
以上がMySQL のグループ内でデータをランク付けするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。