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

したがって、デッドロックを回避するためにユーザーランクを計算するより良い方法があるかどうか知りたいですか?

4

1 に答える 1

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
于 2012-12-20T02:54:49.487 に答える