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

MySQL 查詢結果集添加行號:用戶變量模擬 ROW_NUMBER()

     編輯:MySQL 綜合教學

MySQL 查詢結果集添加行號:用戶變量模擬 ROW_NUMBER()

MySQL 5.x/8.0 前無內置 ROW_NUMBER(),通過會話用戶變量 @rownum 實現結果集行號生成,適用於分頁定位、排名顯示、異常行定位。

基礎語法

SET @mycnt = 0;
SELECT 
    (@mycnt := @mycnt + 1) AS rownum,
    othercol
FROM tblname
ORDER BY othercol;
  • @mycnt 會話級變量,連接斷開自動釋放。
  • := 賦值運算符,在 SELECT 列表中按行遞增。
  • 必須配合 ORDER BY,否則行號順序不確定。

進階應用:定位特定記錄在排序後的位置

SET @mycnt = 0;
SELECT * FROM (
    SELECT 
        (@mycnt := @mycnt + 1) AS rownum,
        othercol
    FROM tblname
    ORDER BY othercol
) AS ranked
WHERE othercol = 'TargetValue';

返回該記錄在全量排序中的行號,避免應用層全量拉取計算。

對比方案:臨時表 + AUTO_INCREMENT

CREATE TEMPORARY TABLE tmp_ranked (
    rownum INT AUTO_INCREMENT PRIMARY KEY,
    othercol VARCHAR(255)
) ENGINE=Memory;

INSERT INTO tmp_ranked (othercol)
SELECT othercol FROM tblname ORDER BY othercol;

SELECT * FROM tmp_ranked WHERE othercol = 'TargetValue';
方案優點缺點
用戶變量無建表開銷、單語句完成、主從安全(不寫 Binlog)無法直接用於 WHERE/HAVING(需子查詢包裹)、8.0+ 建議用窗口函數
臨時表 AUTO_INCREMENT可直接 WHERE 過濾、行號持久化主從複製可能不一致(臨時表不復制)、佔用內存/磁盤、需顯式 DROP

MySQL 8.0+ 標準寫法

SELECT 
    ROW_NUMBER() OVER (ORDER BY othercol) AS rownum,
    othercol
FROM tblname;
  • 窗口函數標準、高效、可直接用於 WHERE(通過子查詢/QUALIFY)。
  • 5.7 及以下版本堅持用戶變量方案。

行號生成是「分析型查詢」標配。變量法輕量、臨時表法重型、窗口函數法標準。按版本與場景選型,拒絕應用層全量拉取計算行號。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved