首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 利用變數實現排名查詢:單用戶名次與全量排名單表解決

     編輯:MySQL 綜合教學

MySQL 利用變數實現排名查詢:單用戶名次與全量排名單表解決

需求:查詢某用戶成績在所有用戶中的排名。MySQL 8.0 前無窗口函數,可用會話變數 @rowNum 模擬 ROW_NUMBER()。

方案:兩步走或子查詢單語句

步驟 1:產生全量排名表

SELECT id, maxScore, (@rowNum := @rowNum + 1) AS rowNo
FROM t_user, (SELECT @rowNum := 0) AS b
ORDER BY t_user.maxScore DESC;

步驟 2:查詢指定用戶排名

SELECT u.rowNo
FROM (
    SELECT id, (@rowNum := @rowNum + 1) AS rowNo
    FROM t_user, (SELECT @rowNum := 0) AS b
    ORDER BY t_user.maxScore DESC
) AS u
WHERE u.id = '2015091810371700001';

關鍵點解析

  • (SELECT @rowNum := 0) AS b:在 FROM 子句中初始化變數,**別名 b 必須保留**(MySQL 要求衍生表有別名)
  • @rowNum := @rowNum + 1:賦值並遞增,:= 為賦值運算子(區別於比較運算子 =)
  • ORDER BY maxScore DESC:必須在外層或子查詢中排序,**排名邏輯依賴有序輸入**
  • 若有同分並列需求,需改用 DENSE_RANK 邏輯(變數法較複雜,建議升級 MySQL 8.0 使用窗口函數)
現代化建議: MySQL 8.0+ 直接使用 ROW_NUMBER() OVER (ORDER BY maxScore DESC) 或 RANK()/DENSE_RANK(),語意清晰、效能更優、支援並列排名。維舊專案時本變數法為實用替代方案。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved