假设我有
SELECT * FROM t ORDER BY j
有没有办法指定查询还返回一个自动增量列,该列与结果一起指定排序中该行的排名?
此列也适用于使用范围LIMIT,例如
SELECT * FROM t ORDER BY j LIMIT 10,20
应该有自动增量列返回11,12,13,14等....
答案 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来获得你想要的行为。