在撰寫報表或分頁查詢時,經常需要為結果集添加一列遞增的序號。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 @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 後,請直接使用標準窗口函數,效能更好、語意更清晰:
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;
SET,便於調試。ROW_NUMBER() 窗口函數。