mysql 更新 排名_更新MySQL表中的排名

一种选择是使用排名变量,例如:

UPDATE player

JOIN (SELECT p.playerID,

@curRank := @curRank + 1 AS rank

FROM player p

JOIN (SELECT @curRank := 0) r

ORDER BY p.points DESC

) ranks ON (ranks.playerID = player.playerID)

SET player.rank = ranks.rank;

JOIN(SELECT @curRank:= 0)部分允许变量初始化而无需单独的SET命令.

进一步阅读这个主题:

测试用例:

CREATE TABLE player (

playerID int,

points int,

rank int

);

INSERT INTO player VALUES (1, 150, NULL);

INSERT INTO player VALUES (2, 100, NULL);

INSERT INTO player VALUES (3, 250, NULL);

INSERT INTO player VALUES (4, 200, NULL);

INSERT INTO player VALUES (5, 175, NULL);

UPDATE player

JOIN (SELECT p.playerID,

@curRank := @curRank + 1 AS rank

FROM player p

JOIN (SELECT @curRank := 0) r

ORDER BY p.points DESC

) ranks ON (ranks.playerID = player.playerID)

SET player.rank = ranks.rank;

结果:

SELECT * FROM player ORDER BY rank;

+----------+--------+------+

| playerID | points | rank |

+----------+--------+------+

| 3 | 250 | 1 |

| 4 | 200 | 2 |

| 5 | 175 | 3 |

| 1 | 150 | 4 |

| 2 | 100 | 5 |

+----------+--------+------+

5 rows in set (0.00 sec)

更新:刚刚注意到您需要联系以共享相同的排名.这有点棘手,但可以通过更多变量来解决:

UPDATE player

JOIN (SELECT p.playerID,

IF(@lastPoint <> p.points,

@curRank := @curRank + 1,

@curRank) AS rank,

@lastPoint := p.points

FROM player p

JOIN (SELECT @curRank := 0, @lastPoint := 0) r

ORDER BY p.points DESC

) ranks ON (ranks.playerID = player.playerID)

SET player.rank = ranks.rank;

对于测试用例,让我们添加另一个175分的玩家:

INSERT INTO player VALUES (6, 175, NULL);

结果:

SELECT * FROM player ORDER BY rank;

+----------+--------+------+

| playerID | points | rank |

+----------+--------+------+

| 3 | 250 | 1 |

| 4 | 200 | 2 |

| 5 | 175 | 3 |

| 6 | 175 | 3 |

| 1 | 150 | 4 |

| 2 | 100 | 5 |

+----------+--------+------+

6 rows in set (0.00 sec)

如果你需要等级跳过一个地方以防平局,你可以添加另一个IF条件:

UPDATE player

JOIN (SELECT p.playerID,

IF(@lastPoint <> p.points,

@curRank := @curRank + 1,

@curRank) AS rank,

IF(@lastPoint = p.points,

@curRank := @curRank + 1,

@curRank),

@lastPoint := p.points

FROM player p

JOIN (SELECT @curRank := 0, @lastPoint := 0) r

ORDER BY p.points DESC

) ranks ON (ranks.playerID = player.playerID)

SET player.rank = ranks.rank;

结果:

SELECT * FROM player ORDER BY rank;

+----------+--------+------+

| playerID | points | rank |

+----------+--------+------+

| 3 | 250 | 1 |

| 4 | 200 | 2 |

| 5 | 175 | 3 |

| 6 | 175 | 3 |

| 1 | 150 | 5 |

| 2 | 100 | 6 |

+----------+--------+------+

6 rows in set (0.00 sec)

注意:请考虑我建议的查询可以进一步简化.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值