我展示你我做這件事的方式[區間SQL更新功能]
選擇:
set @currentRank = 0,
@lastRating = null,
@rowNumber = 1;
select
*,
@currentRank := if(@lastRating = `score`, @currentRank, @rowNumber) `rank`,
@rowNumber := @rowNumber + if(@lastRating = `score`, 0, 1) `rowNumber`,
@lastRating := `score`
from `table`
order by `score` desc
更新:
set @currentRank = 0,
@lastRating = null,
@rowNumber = 1;
update
`table` r
inner join (
select
`primaryID`,
@currentRank := if(@lastRating = `score`, @currentRank, @rowNumber) `rank`,
@rowNumber := @rowNumber + if(@lastRating = `score`, 0, 1) `rowNumber`,
@lastRating := `score`
from `table`
order by `score` desc
) var on
var.`primaryID` = r.`primaryID`
set
r.`rank` = var.`rank`
i沒有進行任何性能檢查,除了測試它的工作
+1:通常我會說這應該是在視圖中,但MySQL視圖不允許變量使用。還有一種替代方法是在子查詢中使用COUNT來獲得在我想象的視圖中能夠工作的排名值... – 2010-07-07 17:10:52
這在哪裏更新了數據庫中的值? – quantumSoup 2010-07-07 17:39:18