繁体   English   中英

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

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

SQL 相当新,所以如果这很明显,我很抱歉。

我有一张销售游戏数量及其在畅销书排行榜中的相应排名(1、2、3 等)的表格。 这个表叫做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 ;

从我在这里和谷歌上可以找到的内容,我找不到任何类似的东西,尽管这可能是一个相当常见的查询。 任何见解将不胜感激。

编辑:我正在使用 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
 游戏等级 |  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
 游戏等级 |  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
 游戏等级 |  global_sales --------: |  ------------: 1 |  300 2 |  250 3 |  200 4 |  125

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM