mysql行号实现始终是增量的(从1到n排序)

标签 mysql select sql-order-by row

我之前的搜索结果(包含确实对我有帮助的 MySQL - row number in recordset?)并不令人满意,因为按其他列排序会覆盖 @RowNumber 的 native 排序。

考虑下面我简化的成员表:

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

注意:表、查询和任何其他内容都不是经过测试的示例。只有问题本身存在于现实世界中!

我认为这些简单的情况很容易理解和解决。 (如果有任何问题,请忘记那些小错误并考虑重要问题本身)

最佳答案

这应该是显而易见的:先对行进行编号,然后再对它们进行排序。

SELECT * FROM (
  SELECT id, firstname, lastname, @RowNumber = @RowNumber + 1 AS row_number
  FROM member, (SELECT @RowNumber := 0) AS counter_table
) AS sq
ORDER BY firstname DESC

哦等等...你实际上想要相反的方式,先订购,后编号:

SELECT sq.*, @RowNumber = @RowNumber + 1 AS row_number FROM (
  SELECT id, firstname, lastname
  FROM member
  ORDER BY firstname DESC
) AS sq
CROSS JOIN (SELECT @RowNumber := 0) AS counter_table

关于mysql行号实现始终是增量的(从1到n排序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9466517/

相关文章:

MySql 求和别名

php - MySQL 迁移 WordPress 时出错

mysql - SELECT 查询将表的行作为 MySQL 中的列

mysql - 如何使用 IN 数组过滤器连接三个表,但仍获取第三个表中的所有行

ruby-on-rails - 使用 Rails 3.0 + Postgres 的复杂排序查询

Mysql游标未运行嵌套循环

php - 选择计数,使用 PHP PDO 求和

mysql - ORDER BY 帮助 : How to get Average score PER YEAR?

JPA 1.0 @OrderBy 使用字段名称与 JPA 2.0 @OrderColumn 使用列名称

sql - 无效查询的 MySQL 日志