mysql根据select查询结果 循环更改

本文通过两个示例展示了如何使用SQL游标从一个表中读取数据,并根据这些数据对另一个表进行条件判断及更新操作。第一个示例涉及用户红包数据的更新与删除,第二个示例则关注游戏活动箱的状态更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从一表中查询出一列数据,根据这一列数据来从另外一表中进行 判断修改等操作


BEGIN
	DECLARE done tinyint default 0;
	DECLARE uid int(11);
	DECLARE cs CURSOR FOR SELECT userId FROM tbuser_red_envelope_award_log WHERE fromActiveId="1454136362";
	DECLARE continue handler for sqlstate '02000' set done=1;
	open cs;
	while done<>1 do
    fetch cs into uid;
		SELECT giftNum into @giftNum FROM tbuser_red_envelope_award_log WHERE userId=uid AND gifttemplateId=101;
		IF EXISTS(SELECT id FROM tbuser_bag WHERE awardNum>=@giftNum AND userId=uid AND gifttemplateId=101)THEN 
			UPDATE tbuser_bag SET awardNum=awardNum-@giftNum WHERE awardNum>=@giftNum AND userId=uid AND gifttemplateId=101;
		END IF;

		IF EXISTS(SELECT id FROM tbuser_bag_exchange WHERE userId=uid AND excNum>=@giftNum-5 AND addTime>"2016-01-30 18:00:00")THEN
			UPDATE tbuser_bag_exchange SET excNum=excNum-@giftNum,excTotalScore=excTotalScore-@giftNum  WHERE userId=uid AND excNum>=@giftNum-5 AND addTime>"2016-01-30 18:00:00";
		END IF;

		DELETE FROM tbuser_bag_exchange WHERE excNum<=0 AND addTime>"2016-01-30 18:00:00";
	end while;
	close cs;	
END


例2:

BEGIN

		DECLARE $gameId int;			
		DECLARE STOP INT DEFAULT 0;
		DECLARE game_id CURSOR FOR SELECT id FROM tbgames_box_activity;
		DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET STOP=1;
		OPEN  game_id;
		FETCH game_id INTO $gameId;

		WHILE STOP <> 1 DO

				SET @today = CONCAT(date(NOW())," 00:00:01");

				IF EXISTS(SELECT id  FROM tbgames_box_activity WHERE id = $gameId AND addTime<@today AND isOpen=1 LIMIT 1) THEN

					SELECT awardPool,smallAwardBoxNum,awardAllocType,awardPoolType,awardPoolRemainder INTO @awardPool, @smallAwardBoxNum,@awardAllocType,@awardPoolType,@awardPoolRemainder 
							FROM tbgames_box_activity WHERE id = $gameId AND addTime<@today AND isOpen=1 LIMIT 1;

					IF @awardPoolType=0 THEN

						IF @awardAllocType=1 THEN 
							SET @num=FLOOR(1 + (RAND() * 3));
							UPDATE tbgames_box_activity SET awardPoolRemainder=@awardPool+@awardPoolRemainder,realBoxNum=@smallAwardBoxNum,addTime=NOW(),bigAwardBoxNum=@num WHERE id = $gameId AND addTime<@today;
						ELSE 
							UPDATE tbgames_box_activity SET awardPoolRemainder=@awardPool+@awardPoolRemainder,realBoxNum=@smallAwardBoxNum,addTime=NOW() WHERE id = $gameId AND addTime<@today;
						END IF;

					ELSE 

						IF @awardAllocType=1 THEN 
							SET @num=FLOOR(1 + (RAND() * 3));
							UPDATE tbgames_box_activity SET awardPoolRemainder=@awardPool,realBoxNum=@smallAwardBoxNum,addTime=NOW(),bigAwardBoxNum=@num WHERE id = $gameId AND addTime<@today;
						ELSE 
							UPDATE tbgames_box_activity SET awardPoolRemainder=@awardPool,realBoxNum=@smallAwardBoxNum,addTime=NOW() WHERE id = $gameId AND addTime<@today;
						END IF;

					END IF;

				END IF;	

		FETCH game_id INTO $gameId;  
		
		END WHILE; 

		CLOSE game_id;

END




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值