身為資料庫管理員,您可能需要對分組資料集中的項目進行排名。 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中文網其他相關文章!