MySQL:想要使用存储过程按一列对 table 进行排序,然后使用该排序设置另一列的值

MySQL: Want to use a stored procedure to sort table by one column, then use that ordering to set values of another column

对 SQL 很陌生,如果这很明显,我深表歉意。

我有一个 table 的游戏销售数量和它们在畅销书列表中的相应排名(1、2、3 等)。这个table叫做ranking(rank: bigint, global_sales: double).

我想做的是做一个存储过程,我可以在销售更新时调用它,然后可以调用这个过程来更新排名。这是我目前所知道的,恐怕它可能非常不正确:

delimiter $$
drop procedure if exists updateRank;
create procedure updateRank()
begin
    select *
    from ranking
    order by global_sales desc;
    
    declare r bigint default 1;
    
    loop1: loop
        GameRank = r;
        set r=r+1;
    end loop loop1;
end $$
delimiter ;

根据我在此处和 Google 上可以找到的内容,我找不到任何类似的内容,尽管这可能是一个相当常见的查询。任何见解将不胜感激。

编辑:我正在使用 MySQL Workbench 版本 8.0 CE

你可以循环执行 但你也可以在查询中做到这一点

当然我不知道你的表格布局,但这些告诉你如何更新

CREATE Table ranking (GameRank  INt,global_sales  INT);
INSERT INTO `ranking` VALUES(0,200),(0,300),(0,250),(0,125)
SELECT * FROM ranking
GameRank | global_sales
-------: | -----------:
       0 |          200
       0 |          300
       0 |          250
       0 |          125

MYsql 5.x

SET @ranking = 0
UPDATE ranking r 
INNER JOIN (SELECT @ranking := @ranking + 1 _rank, global_sales FROM ranking ORDER BY global_sales DESC) t  ON  r.global_sales = t.global_sales
  SET GameRank = _rank
SELECT * FROM ranking   OrDER By global_sales DESC
GameRank | global_sales
-------: | -----------:
       1 |          300
       2 |          250
       3 |          200
       4 |          125

MYSQL 8

UPDATE ranking r 
INNER JOIN (SELECT global_sales,RANK() OVER (  ORDER BY global_sales DESC ) my_rank FROM ranking) t  
ON  r.global_sales = t.global_sales
  SET GameRank = my_rank
SELECT * FROM ranking   OrDER By global_sales DESC
GameRank | global_sales
-------: | -----------:
       1 |          300
       2 |          250
       3 |          200
       4 |          125

db<>fiddle here