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
对 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