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

MySQL 查詢結果快速添加序號的兩種實用技巧

     編輯:MySQL 綜合教學

MySQL 查詢結果自動生成行號(序號)實戰

在撰寫報表或分頁查詢時,經常需要為結果集添加一列遞增的序號。MySQL 8.0 以前沒有內建 ROW_NUMBER() 窗口函數,但可以利用用戶變量輕鬆實現。本文介紹兩種最常用、相容性最好的寫法。

方法一:單條語句內聯初始化(推薦,最簡潔)

SELECT (@i := @i + 1) AS i, t.*
FROM table_name t, (SELECT @i := 0) AS it;

原理:在 FROM 子句中用衍生表 (SELECT @i := 0) 初始化變量 @i,隨後在 SELECT 列表中每行遞增。適用於臨時查詢、無需預先執行 SET 語句。

方法二:預先 SET 變量再查詢(適合存儲過程/複雜邏輯)

SET @rownum = 0;
SELECT @rownum := @rownum + 1 AS rownum, t.username
FROM auth_user t
LIMIT 1, 5;

先用 SET 初始化,再在查詢中引用。注意:若在同一會話中多次執行,變量值會累積,建議每次查詢前重新 SET @rownum = 0。

進階應用:分組內編號

若需在每個分組內重新編號(如每個用戶的訂單編號 1,2,3...),可結合 CASE WHEN 判斷分組欄位是否變化:

SELECT 
    @row := CASE WHEN @prev_user = user_id THEN @row + 1 ELSE 1 END AS row_num,
    @prev_user := user_id AS user_id,
    order_id
FROM orders, (SELECT @row := 0, @prev_user := NULL) vars
ORDER BY user_id, order_id;

MySQL 8.0+ 現代寫法

升級到 MySQL 8.0 後,請直接使用標準窗口函數,效能更好、語意更清晰:

SELECT ROW_NUMBER() OVER (ORDER BY id) AS rn, *
FROM table_name;
-- 分組編號
SELECT ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_id) AS rn, *
FROM orders;

小結

  • MySQL 5.x:首選「方法一」單語句內聯初始化,無副作用、可直接嵌入視圖/子查詢。
  • 存儲過程/批量腳本:用「方法二」預先 SET,便於調試。
  • 生產環境建議升級 MySQL 8.0+,改用 ROW_NUMBER() 窗口函數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved