2011-11-18 9 views
1

假設我有獲得中行mysql命令排名BY語句

SELECT * FROM t ORDER BY j 

有指定查詢也返回一個自動增量列的結果一起去指定的該排名的方式排在排序方面?

也該列也應該使用範圍限制時,如

SELECT * FROM t ORDER BY j LIMIT 10,20 

應該有工作的自動增量列返回11,12,13,14等....

回答

1

的Oracle,MSSQL等支持但是不幸的是,MySQL在這方面有一些追趕的功能。

我去過能夠得到在MySQL接近ROW_NUMBER() OVER()最接近的是這樣的:

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

我不知道怎麼會使用排名範圍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來獲得你想要的行爲。