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 |
為了根據成績對每個班級中的學生進行排名,可以使用以下MySQL查詢:
<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>
此查詢包含以下步驟:
變數初始化: 兩個使用者變數 @student
和 @class
初始化為 0。
逐行處理: 外層查詢依 ORDER BY
子句指定的順序(id_class
,grade DESC
,id_student
)處理結果集的每一行。 注意這裡排序使用了 grade DESC
,確保成績高的學生排名靠前。
組內排名: CASE
語句檢查目前 id_class
是否與前一個 id_class
(@class
) 相同。如果相同,則將 @student
加 1;否則,將 @student
重設為 1。這確保了 rn
值(排名)在每個組別(id_class
)內是唯一的。
分組賦值: @class
賦值為目前 id_class
,將在下一行進行比較。
此查詢的輸出將提供所需的學生分組排名:
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 中對組內資料進行排名?的詳細內容。更多資訊請關注PHP中文網其他相關文章!