MySQL存储过程之计算某列值之和小于固定值的所有累加行ID

简单表结构如下:



要求的的话,也就是通过将test中的value值累加(ID升序排列),类似于贪心算法,尽可能多加,但是和得小于450,那么将所有满足的行ID打印出来

(注意:会多直到值大于450停止,也就是会多添加一个ID,需要调用程序进行相关控制)。

-- 初始化
drop procedure if exists useCursor;
-- 建立 存储过程 create
CREATE PROCEDURE useCursor()
    BEGIN
    -- 局部变量的定义 declare
		declare total INT default 0 ;
		declare tmpid INT default 0 ;
		declare tmp INT default 0 ;
    declare allId varchar(255) default '' ;
         
    declare cur1 CURSOR FOR SELECT value FROM test.test ORDER BY id ASC ;
    declare cur2 CURSOR FOR SELECT id FROM test.test ORDER BY id ASC;
    
		-- 开游标
    OPEN cur1;
    OPEN cur2;
    -- 游标向下走一步
    FETCH cur1 INTO tmp;
    FETCH cur2 INTO tmpid;

    repeat  
        set total = total + tmp;
	set allId = CONCAT(allId ,CONCAT(tmpid ,";")) ;
	-- 游标向下走一步
	FETCH cur1 INTO tmp;
	FETCH cur2 INTO tmpid;
        until total > 450  
    end repeat;  
/*     
    -- 循环体 
    WHILE ( total <= 450 ) DO
				
	set total = total + tmp;
        set tmpName = CONCAT(tmpid ,";") ;
        set allName = CONCAT(allName ,tmpName) ;
        -- 游标向下走一步
        FETCH cur1 INTO tmp;
	FETCH cur2 INTO tmpid;
    END WHILE;
*/  
    CLOSE cur1;
    CLOSE cur2;
    select allId ;
END;


call useCursor()


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值