Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用位置mysql更新一行_Mysql_Sql - Fatal编程技术网

用位置mysql更新一行

用位置mysql更新一行,mysql,sql,Mysql,Sql,我目前正在数据库中编写一个小的排名系统。该站点的主要问题是SQL查询是有限的,这就是为什么我尝试编写数量较少的查询,即使这意味着更复杂的查询。目前,我的排名表包含3个字段:用户id、分数和排名。显然,一个更好的分数意味着一个更高的排名,这是我的一些数据 CREATE TABLE ranking(user_id INT, score INT, rank INT); INSERT INTO ranking(user_id, score, rank) VALUES (1, 150, 1),

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

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的排名应该是5,是否可以使用纯SQL并仅在一个或两个查询中执行此操作?我不知道如何构建如此复杂的查询

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

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

与其在创建时手动插入排名,为什么不在将来选择时对其进行排名?这样,它将始终考虑任何更新的值。@MichaelMcGriff这是一个好主意,但事实是,我经常需要检查用户x是否有排名y,并且只有该用户,因此在我看来,每次检查特定用户的排名时,检查数据库中的排名比重新生成整个排名更容易。但是你的想法仍然很好,如果我发现我的问题的答案太复杂,我会使用它哇,正是我想要的,谢谢,太多了!