Mysql 基于行的数值进行更新

Mysql 基于行的数值进行更新,mysql,database,Mysql,Database,我需要在MySQL中制作一个积分系统,积分是根据某一列的位置添加的。示例:共有5名玩家,在“征服者”行中得分最高的玩家获得5分,第二名玩家获得4分,第三名玩家获得3分,以此类推。 这是一个在计算点时调用的存储过程: BEGIN select Player_name into @a from Player where Conqueror = (select max(Conqueror) from Player); select Player_name into @b from Player whe

我需要在MySQL中制作一个积分系统,积分是根据某一列的位置添加的。示例:共有5名玩家,在“征服者”行中得分最高的玩家获得5分,第二名玩家获得4分,第三名玩家获得3分,以此类推。 这是一个在计算点时调用的存储过程:

BEGIN
select Player_name into @a from Player where Conqueror = (select max(Conqueror) from Player);
select Player_name into @b from Player where Conqueror = (select max(Conqueror) from Player where Player_name != @a);
select Player_name into @c from Player where Conqueror = (select max(Conqueror) from Player where Player_name != @a and Player_name != @b );
select Player_name into @d from Player where Conqueror = (select max(Conqueror) from Player where Player_name != @a and Player_name !=@b and Player_name !=@c);
select Player_name into @e from Player where Conqueror = (select max(Conqueror) from Player where Player_name != @a and Player_name !=@b and Player_name !=@c and Player_name !=@d );
select count(Conqueror) into @playernum from Player;
update Player set Points = Points + @playernum where Player_name = @a;
update Player set Points = Points + @playernum-1 where Player_name = @b;
update Player set Points = Points + @playernum-2 where Player_name = @c;
update Player set Points = Points + @playernum-3 where Player_name = @d;
update Player set Points = Points + @playernum-4 where Player_name = @e;
END

这段代码看起来很糟糕,但除了有相同分数的玩家外,它工作正常。在这种情况下,一个MySQL错误#1172-由于两个或多个玩家的名字被添加到一个变量中,结果由多行组成。有谁能告诉我如何解决这个问题吗?

我还没有时间玩它,并提出了一个解决方案,玩家4可以得到2分,而不是3分,但这可能只是在IF语句中添加额外的一点。但根据这篇博文:

实际上,我会去掉存储过程,并在一个update语句中使用subselect完成整个过程。类似(完全未经测试!):

如果我猜对了语法,应该把5分配给最高的,把4分配给第二个,除非两个玩家的分数相同,一个会得到4,另一个会得到3。查看博客文章中的IF语句,它将解决此问题-我将在以后有更多时间时查看:)

编辑

如果博客被删除,我指的是IF声明:

select IF(@score=p.score, @rownum, @rownum:=@rownum+1) rank2, p.*, (@score:=p.score) dummy from player p, 
(SELECT @rownum:=0) x, 
(SELECT @score:=0) y 
order by score desc limit 10;

如果您不需要将具有相同
征服者的用户放置在同一位置
您可以使用这个查询:-)而不是5

更新后的查询已经允许用户拥有相同的
征服者
值,并且根据您的评论,他们将获得相同的分数:


理想情况下,假设2号和3号球员的得分相同。玩家2获得4分,玩家3也获得4分,但玩家4将获得2分。因此,当分数相同时,所有玩家都会获得分数,就好像他们是唯一拥有该分数的玩家一样伏都教

SET @rank = 6;
UPDATE Player 
INNER JOIN 
(
  SELECT player_id,
    @rank := @rank-1 as rank,
    CASE WHEN @prev = Conqueror 
      THEN @correction := @correction+1 
      ELSE @correction := 0  
    END as correction,
    @prev := Conqueror
  FROM Player
  ORDER BY Conqueror DESC
  LIMIT 5
) as r
ON Player.player_id = r.player_id
SET Points = Points + r.rank + r.correction;
如果你需要将具有相同<代码>征服者
成绩的玩家放在同一等级,请给我更多的规则来处理这种情况

编辑-解释

既然你评论说你不明白我的问题是怎么回事,我会试着解释一下

因此,
@prev
var保存前一个顶级玩家执行的值

例如,对于排名第二的玩家,它将持有第一名玩家的
征服者

我们需要比较排名第二的球员是否与排名第一的球员得分相同,以便给他与您在评论中要求的分数相同的分数


r.rank
r.correction
为您要添加到
积分
字段的玩家保留等级(点数/位置从5到1)。如果玩家拥有相同的
征服者
,我们需要给出相同数量的分数,即使排名为2和3,例如,但第二名玩家的分数将相同rank=4+correction=0,第三名玩家的分数将相同rank=3+correction=1,请提供表格结构。看起来你有索引冲突。如果两个玩家的征服者分数相同,你会如何奖励分数?两个人的分数相同,然后跳到下一个人?或者别的什么?只有一个表有几个列,这个表上没有索引。玩家| name VARCHAR(50)|征服者INT |墙|破坏者INT |牢不可破intidealy,假设2号和3号玩家的分数相同。玩家2获得4分,玩家3也获得4分,但玩家4将获得2分。所以当有相同的分数时,所有的玩家都会得到分数,就好像他们是唯一拥有该分数的人一样。我不明白@prev是什么,在它被赋予一个值之前,你怎么能进入一个案例。另外,你所说的Player.id是什么意思,我是否应该用Player-id额外列一列,我也不知道你所说的查询末尾的r.rank或r.correction是什么意思。谢谢你的回答,但我真的不明白。@Voodoo-hmmm。你没有
player.id
栏吗?因此,您对播放器的唯一索引是
player\u name
?我添加了一个播放器id,自动递增,现在它是唯一的主键。你能解释一下你的代码是如何工作的吗?我已经在我的帖子上做了解释,请检查一下。如果您的密钥名为
player\u id
请给我一点时间来修复查询
SET @rank = 6;
UPDATE Player 
INNER JOIN 
(
  SELECT player_id,
    @rank := @rank-1 as rank,
    CASE WHEN @prev = Conqueror 
      THEN @correction := @correction+1 
      ELSE @correction := 0  
    END as correction,
    @prev := Conqueror
  FROM Player
  ORDER BY Conqueror DESC
  LIMIT 5
) as r
ON Player.player_id = r.player_id
SET Points = Points + r.rank + r.correction;