2012-12-18 36 views
2

我有一個紙牌遊戲,其中用戶排名遊戲贏得了多少遊戲。總體評價是預先計算的,以便能夠快速加載,但我有關於排名計算的問題。智能用戶排名計算

排名的計算方法如下:

SET @userRank = 0; 

UPDATE t_ratings AS r 
JOIN 
    (
    SELECT 
     userId, (@userRank := @userRank + 1) as rank 
     FROM (
     SELECT 
      r.userId, 
      r.solvedCount, 
      r.playedCount 
     FROM 
     t_ratings AS r       
    ORDER BY r.solvedCount DESC , r.playedCount ASC) AS t 
) AS rt 
    ON rt.userId = r.userId 
SET r.rank = rt.rank 

但最近我開始變得有時以下錯誤:

Deadlock found when trying to get lock; try restarting transaction 

因此,我想知道是否有更好的方法來計算用戶排名以避免死鎖?

+0

在[dba.se]似乎更合適。投票遷移。 –

回答

1

這就是我如何在SQL Server中執行它......不確定mySQL是否具有窗口函數,因爲我不是一個mySQL人員。

With cte As 
(
     Select Rank() Over (ORDER BY r.solvedCount DESC , r.playedCount ASC) As [rank], 
       userID 
     From t_ratings As r 
) 
Update tr 
Set  [rank] = c.[rank] 
From t_ratings tr 
Join cte c 
     On tr.userID = c.userID