我以前的搜索结果(包含MySQL - row number in recordset?真的帮了我很大忙)并不令人满意,因为按其他列排序会覆盖本机排序@RowNumber
。总是递增的mysql行号实现(从1到n排序)
考虑我的简化member
见下表:
row_number | id | firstname | lastname
--------------------------------------
1 | 1 | Steve | Jobs
2 | 2 | Bill | Gates
3 | 3 | Rasmus | Lerdorf
4 | 4 | Linus | Torvalds
导致由以下查询:
SELECT id, firstname, lastname, @RowNumber = @RowNumber + 1 AS row_number
FROM member, (SELECT @RowNumber := 0) AS counter_table
但是,当我要去基于比ROW_NUMBER或ID,其他的一些列排序row_number
的排序会损坏:
SELECT id, firstname, lastname, @RowNumber = @RowNumber + 1 AS row_number
FROM member, (SELECT @RowNumber := 0) AS counter_table
ORDER BY firstname DESC
结果:
row_number | id | firstname | lastname
--------------------------------------
2 | 2 | Bill | Gates
4 | 4 | Linus | Torvalds
3 | 3 | Rasmus | Lerdorf
1 | 1 | Steve | Jobs
注意:表,查询和其他任何东西都不是测试示例。只有问题本身在现实世界中!
我认为这些简单的情况很容易理解和解决。 (如果他们有任何问题,请忘记这些小错误,并考虑自己的重要问题)
当然它会“腐败”。没有规则说明记录集中行号是什么,因为结果是动态创建的,但是您有一列表示行的编号。这就是人们通常在应用程序而不是数据库中执行此功能的原因。 – 2012-02-27 14:22:35
rownumber不是表中的静态列,因此列上的任何排序都将优先。您可以尝试创建一个将rownumber作为其中一列的视图,然后针对该视图运行查询。 – Brian 2012-02-27 14:22:54
这是因为'ORDER'在SELECT后出现。如果您在名字上添加索引,结果将按顺序返回,而不是稍后排序,因此它可以工作。它仍然闻起来。 – 2012-02-27 14:27:12