获取mysql ORDER BY语句中行的排名

时间:2011-11-18 07:17:48

标签: mysql sql

假设我有

SELECT * FROM t ORDER BY j

有没有办法指定查询还返回一个自动增量列,该列与结果一起指定排序中该行的排名?

此列也适用于使用范围LIMIT,例如

SELECT * FROM t ORDER BY j LIMIT 10,20

应该有自动增量列返回11,12,13,14等....

1 个答案:

答案 0 :(得分:1)

Oracle,MSSQL等支持完全按照你想要的排名功能,不幸的是,MySQL在这方面有一些赶超。

我在MySQL中能够接近ROW_NUMBER() OVER()的最近值是这样的:

SELECT t.*, 
       @rank = @rank + 1 AS rank
FROM t, (SELECT @rank := 0) r
ORDER BY j

我不知道如何使用ranged LIMIT进行排名,除非您在子查询中使用它(尽管性能可能会受到大型数据集的影响)

SELECT T2.*, rank
FROM (
    SELECT t.*, 
           @rank = @rank + 1 AS rank
    FROM t, (SELECT @rank := 0) r
    ORDER BY j
    ) t2
LIMIT 10,20

另一种选择是创建一个临时表,

CREATE TEMPORARY TABLE myRank
(
     `rank` INT(11) NOT NULL AUTO_INCREMENT,
     `id` INT(11) NOT NULL,
     PRIMARY KEY(id, rank)
)

INSERT INTO myRank (id)
SELECT T.id
FROM T 
ORDER BY j

SELECT T.*, R.rank
FROM T
    INNER JOIN myRank R 
        ON T.id = R.id 
LIMIT 10,20

当然,临时表需要在调用之间保持不变。

我希望有更好的方法,但如果没有ROW_NUMBER(),你必须诉诸一些hackery来获得你想要的行为。