mysql事件里面循环判断_Mysql游标循环实现每行判断累加

我这边直接说案例(能解决什么样的问题)

关于Mysql游标的语法含义,还请百度了解。

如图1,需求是,从上往下,相同的name1,score进行累加统计,得到图2;

不是简单的进行Group by的操作。因为结果集会出现相同的name1行

f749f44d98940592818edcce76613625.png
原始表

4e984b9a56ec76ff01c621f10a45f48b.png
结果表

实现代码如下:我将游标循环写在了存储过程里,也可以直接在查询语句中执行;

--原始数据
create table tests01(name1 varchar(10),score int)
insert into tests01(name1,score)
values("甲",10),("甲",20),("乙",10),("乙",30),("乙",20),("乙",30),("甲",10),("丙",20),("丙",30),("丁",10),("丁",10),("甲",40)
--整合后数据
create table tests01_des(id int primary key auto_increment , name1 varchar(10),score int);
--创建存储过程
DELIMITER $$
CREATE  PROCEDURE `StatisticStore`()
BEGIN
declare done INT DEFAULT 0;
declare name2 varchar(10);
declare score2 int;
DECLARE MAXID INT;
declare cur_test cursor for select name1,score from tests01;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

open cur_test;
repeat  
    fetch cur_test into name2,score2;
    if not done then 
    begin
	if ((select count(1) from tests01_des)=0) then 
    insert into tests01_des(name1,score) values(name2,score2);
    else
    begin
		    if (select name1 from tests01_des order by id desc limit 1)=name2 then
            SET  MAXID=( select max(id) from tests01_des);
            update tests01_des set score = score+score2 where id=MAXID;
            else
            insert into tests01_des(name1,score) values(name2,score2);
            end if;
	end;
    end if;
    end;
    end if;
    
    until done end repeat;
    close cur_test;
END$$
DELIMITER ;

--调用执行过程
call StatisticStore();  

--查看数据
select * from tests01;
select* from tests01_des;

其他思路:

也可以将原始表添加自增列,然后使用while循环依次获取表内容进行简单的循环操作,就可以不使用游标啦!

哈哈哈哈哈,等待下班的孩子。。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值