1

我有以下 SQL 脚本,它在排行榜表中对一组用户进行排名。

UPDATE leaderboard
JOIN   (SELECT f.winnings ,
IF     (@lastPoint <> f.winnings,
        @curRank := @curRank +1, 
        @curRank) AS rank, 
        @lastPoint := f.winnings
FROM   leaderboard f
JOIN   (SELECT @curRank := 0, @lastPoint := 0) r
WHERE f.competition =5
ORDER BY f.winnings DESC
) ranks ON (ranks.winnings = leaderboard.winnings)
SET leaderboard.rank = ranks.rank WHERE leaderboard.id =89;

但是,当所有用户的排名为 0 时,它不会将他们排名为 1(即相等),这种行为仅发生在 0 中。

winnings  rank
0          0
0          0
0          0

有人知道该怎么做吗..?

winnings  rank
0          1
0          1
0          1

SQL FIDDLE http://sqlfiddle.com/#!2/53c3a/1

4

2 回答 2

1

Just set @LastPoint to an invalid value:

UPDATE leaderboard
JOIN   (SELECT f.winnings ,
IF     (@lastPoint <> f.winnings,
        @curRank := @curRank +1, 
        @curRank) AS rank, 
        @lastPoint := f.winnings
FROM   leaderboard f
JOIN   (SELECT @curRank := 0, @lastPoint := -1) r
ORDER BY f.winnings DESC
) ranks ON (ranks.winnings = leaderboard.winnings)
SET leaderboard.rank = ranks.rank;
于 2013-08-08T00:22:40.140 回答
1

测试<>失败

UPDATE leaderboard
JOIN   (SELECT f.winnings ,
IF     (@lastPoint <> f.winnings,
        @curRank := @curRank +1, 
        @curRank) AS rank, 
        @lastPoint := f.winnings
FROM   leaderboard f
JOIN   (SELECT @curRank :=0, @lastPoint :=-1) r
ORDER BY f.winnings DESC
) ranks ON (ranks.winnings = leaderboard.winnings)
SET leaderboard.rank = ranks.rank;
于 2013-08-08T00:24:35.760 回答