需求:查詢某用戶成績在所有用戶中的排名。MySQL 8.0 前無窗口函數,可用會話變數 @rowNum 模擬 ROW_NUMBER()。
SELECT id, maxScore, (@rowNum := @rowNum + 1) AS rowNo
FROM t_user, (SELECT @rowNum := 0) AS b
ORDER BY t_user.maxScore DESC;
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(),語意清晰、效能更優、支援並列排名。維舊專案時本變數法為實用替代方案。