使用mysql位置更新一行

时间:2014-07-11 15:46:54

标签: mysql sql

我目前正在数据库中编写一个小排名系统。该站点的主要问题是SQL查询是有限的,这就是为什么我尝试编写较少量的查询,即使这意味着更复杂的查询。目前我的表排名包含3个字段,user_id,得分和排名。显然,更好的分数意味着更高的排名,这是我的数据的SQL fiddle

CREATE TABLE ranking(user_id INT, score INT, rank INT);
INSERT INTO ranking(user_id, score, rank) VALUES 
    (1, 150, 1), 
    (2, 120, 3), 
    (3, 130, 2), 
    (4, 100, 5), 
    (5, 110, 4);

我的目标是编写一个更改分数的查询(从这里没有问题),然后将排名设置为新位置,如果我想在用户4的分数中加15,他的分数将是115,所以他将有一个更好的分数,用户5,他的排名现在应该是4,用户五个排名应该是5,是否有可能使用纯SQL和只有一个(也许)二)查询?我不知道如何构建这样复杂的查询

编辑:经过一些研究,我发现了SET @rn=0; SELECT @rn:=@rn+1 AS rankid的一些查询,但是如何在子查询中使用它来更新受分数变化影响的每个用户的排名?

1 个答案:

答案 0 :(得分:1)

UPDATE ranking AS r1
JOIN (SELECT score AS old_score, score+15 AS new_score FROM ranking WHERE user_id = 4) AS r2
JOIN (SELECT COUNT(*) AS new_rank FROM ranking 
      WHERE user_id != 4 
      AND score > (SELECT score+15 FROM ranking WHERE user_id = 4)) r3
SET r1.score = IF(r1.user_id = 4, r2.new_score, r1.score),
    r1.rank = CASE WHEN r1.user_id = 4 THEN r3.new_rank
                   WHEN (r1.score > r2.old_score) = (r1.score > r2.new_score) THEN r1.rank
                   WHEN r1.score > r2.old_score AND r1.score <= r2.new_score THEN r1.rank + 1
              END

DEMO