2010-01-19 75 views
1

考慮下面的表結構:如何對錶中的行進行排序並獲取行位置?

id name  rank position 
------------------------------- 
1  Steve 5  0 
2  David 3  0 
3  Helen 9  0 
4  Mark 15  0 

我需要一個快速的算法通過rank柱率這些行並存儲在position現場實時的每一行的「位置」。

現在我有一個殘酷的解決方案:

SELECT * FROM table ORDER BY rank DESC 

然後獲取結果在一個循環和更新的每一行填充的位置列。但是如果我有成千上萬的條目呢?我怎樣才能優化它?

+0

您使用的數據庫是? – 2010-01-19 07:25:26

+0

我正在使用MySQL – Darmen 2010-01-19 09:18:07

回答

1

我前幾天回答具體到MySQL的一個非常類似的問題:

Automate MySQL fields (like Excel)

的訣竅是不列存儲在數據庫中,而是在獲取結果時動態計算它。或者,您可以使用觸發器在每次插入,更新或刪除時更新列。

+0

謝謝Mark,我應該測試兩種方式 – Darmen 2010-01-19 09:17:29

0

選擇一個:

WITH t AS 
(
SELECT 
    ROW_NUMBER() OVER (ORDER BY rank) as RowNum 
    ,RANK() OVER (ORDER BY rank) as RankNum 
    ,DENSE_RANK() OVER (ORDER BY rank) as DenseRankNum 
    , * 
FROM table 
) 
UPDATE t set position = RankNum 
--UPDATE t set position = RowNum 
--UPDATE t set position = DenseRankNum 
; 
+1

海報沒有指定哪個數據庫。你可能應該提到這是特定於SQL Server的。例如,它在MySQL中不起作用。 – 2010-01-19 07:28:29

+0

是的,好的。這是我給的一個SQL Server示例。 :) – 2010-01-19 07:41:56

+0

謝謝,我會盡量使它與MySQL兼容 – Darmen 2010-01-19 09:15:40

相關問題