首頁 >資料庫 >mysql教程 >如何在MySQL中使用子查詢和變數進行分組排名?

如何在MySQL中使用子查詢和變數進行分組排名?

Susan Sarandon
Susan Sarandon原創
2025-01-17 19:46:09512瀏覽

How to Perform Grouped Ranking in MySQL Using Subqueries and Variables?

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>

解釋

此查詢逐步操作:

  1. 初始查詢先依 id_class 排序,再依 grade 降序排序。
  2. 臨時變數 @student@class 初始化為 -1。
  3. @class 用來決定是否進入新組。如果儲存在 @class 中的 id_class 的先前值與目前 id_class 不同,則 @student 重設為 0。否則,它遞增。
  4. @class 被賦予 id_class 的新值,並將用於查詢的下一個迭代。
  5. 最後,rn 計算為每組內的排名。 注意,為了確保排名正確,內部查詢需要按照 id_classgrade 降序排序。

這個修改後的查詢更清楚地展示瞭如何使用變數來實現分組排名,並修正了原始查詢中的一些邏輯錯誤,確保排名結果的準確性。 關鍵在於 CASE WHEN 語句的條件判斷,以及對 @student@class 變數的正確更新。

以上是如何在MySQL中使用子查詢和變數進行分組排名?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn