如何对表中的行进行排序并获取行位置?

时间:2010-01-19 07:16:08

标签: php sql

考虑以下表格结构:

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

然后在循环中获取结果并更新填充位置列的每一行。但如果我有成千上万的条目呢?我该如何优化呢?

2 个答案:

答案 0 :(得分:1)

我几天前回答了一个非常类似于MySQL的问题:

Automate MySQL fields (like Excel)

技巧不是将列存储在数据库中,而是在获取结果时动态计算它。或者,您可以在每次进行插入,更新或删除时使用触发器更新列。

答案 1 :(得分: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
;