Mysql
是否可以按照符合 SQL 標準的順序可靠地對行進行編號?
例如,如果我有一個單列表
numbers
,並且我想 1)按 asc/desc 順序對它們進行排序 2)(重新)使用該順序將它們從 1 編號到 n(所以我可以說這個數字是ith
最大的/最小)。如果數據庫沒有 row_number 函式(例如 MySQL),那該怎麼做呢?
如果我理解正確,SELECT 返回未指定行的順序可能會不一致。
像這樣的東西(在類似問題的許多答案中提出)
SET @num = 0; SELECT number, @num := @num + 1 as num FROM ... ORDER BY number
是錯誤的,因為似乎無法保證評估 ORDER BY 的時間。即它可以先對數字進行排序,然後使用 對它們進行編號
@num
,或者它可以做相反的事情並在所有行都被編號後進行排序。我對麼?並且使用內部選擇也無濟於事,因為不能保證訂單會被保留。
有一種方法可以僅使用 SQL 89 功能,但在任何實際大小的表上都會非常慢*:*
select t1.id, ... other columns ..., (select count(*) from the_table t2 where t2.id <= t1.id) as row_num from the_table t1 order by t1.id;
這假定
id
是用於對數字進行排序的列。
MariaDB 10.2.2 有一堆視窗函式。從理論上講,它們應該“符合標準”。
一個例子:(也展示了一個序列號生成器)
SELECT ROW_NUMBER() OVER(ORDER BY seq) AS row_num, seq*seq FROM seq_10_to_20_step_2; +---------+---------+ | row_num | seq*seq | +---------+---------+ | 1 | 100 | | 2 | 144 | | 3 | 196 | | 4 | 256 | | 5 | 324 | | 6 | 400 | +---------+---------+ 6 rows in set (0.00 sec)