考虑以下表格结构:
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 :(得分: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
;