mysql存储过程中的循环嵌套问题

无敌小贱 2013-08-14 04:46:00
begin
declare i int;
declare numareaId int(10);
declare currentareaId int(10);
SELECT COUNT(areaId),MIN(areaId) INTO @a,@b FROM option_area_info;

SET numareaId=@a;
SET currentareaId=@b;

loop1:WHILE numareaId>0 DO
SET @AID = currentareaId;






SET i=1;
loop2:while i<8 do
if exists(select * from statistics_player_l where createTime>=date_sub(curdate(),interval i day) and createTime<date_sub(curdate(),interval i-1 day) and areaId=@AID) then
update statistics_player_l set oneDayPlayer=(select ((select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day) and loginTime>=date_add(date_sub(curdate(),interval i day),interval 1 day) and loginTime<date_add(date_sub(curdate(),interval i day),interval 2 day) and areaId=@AID)/(select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day)))*100) where createTime>=date_sub(curdate(),interval i day) and createTime<date_sub(curdate(),interval i-1 day);
update statistics_player_l set twoDayPlayer=(select ((select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day) and loginTime>=date_add(date_sub(curdate(),interval i day),interval 2 day) and loginTime<date_add(date_sub(curdate(),interval i day),interval 3 day) and areaId=@AID)/(select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day)))*100) where createTime>=date_sub(curdate(),interval i day) and createTime<date_sub(curdate(),interval i-1 day);
update statistics_player_l set threeDayPlayer=(select ((select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day) and loginTime>=date_add(date_sub(curdate(),interval i day),interval 3 day) and loginTime<date_add(date_sub(curdate(),interval i day),interval 4 day) and areaId=@AID)/(select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day)))*100) where createTime>=date_sub(curdate(),interval i day) and createTime<date_sub(curdate(),interval i-1 day);
update statistics_player_l set fourDayPlayer=(select ((select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day) and loginTime>=date_add(date_sub(curdate(),interval i day),interval 4 day) and loginTime<date_add(date_sub(curdate(),interval i day),interval 5 day) and areaId=@AID)/(select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day)))*100) where createTime>=date_sub(curdate(),interval i day) and createTime<date_sub(curdate(),interval i-1 day);
update statistics_player_l set fiveDayPlayer=(select ((select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day) and loginTime>=date_add(date_sub(curdate(),interval i day),interval 5 day) and loginTime<date_add(date_sub(curdate(),interval i day),interval 6 day) and areaId=@AID)/(select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day)))*100) where createTime>=date_sub(curdate(),interval i day) and createTime<date_sub(curdate(),interval i-1 day);
update statistics_player_l set sixDayPlayer=(select ((select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day) and loginTime>=date_add(date_sub(curdate(),interval i day),interval 6 day) and loginTime<date_add(date_sub(curdate(),interval i day),interval 7 day) and areaId=@AID)/(select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day)))*100) where createTime>=date_sub(curdate(),interval i day) and createTime<date_sub(curdate(),interval i-1 day);
update statistics_player_l set sevenDayPlayer=(select ((select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day) and loginTime>=date_add(date_sub(curdate(),interval i day),interval 7 day) and loginTime<date_add(date_sub(curdate(),interval i day),interval 8 day) and areaId=@AID)/(select count(distinct playerId) from log_login where registerTime=date_sub(curdate(),interval i day)))*100) where createTime>=date_sub(curdate(),interval i day) and createTime<date_sub(curdate(),interval i-1 day);
end if;
SET i=i+1;
end while loop2;

SET numareaId=numareaId-1;
SET currentareaId=currentareaId+1;

END WHILE loop1;

end


我用的图形化操作。不会那些命令。这样也可以。中间的update这些大家不用细看,因为我最近刚用数据库所以不是很熟,现在不管效率,只要结果正确就可以,应该有三条数据,但是运行完之后的结果是三条中的数据是一样。自己手动查就不是。我感觉问题可能是出来这个循环条件赋值的地方。但是不知道该咋弄。求高手指点啊~~~在线等~!!!
...全文
670 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
关工 2013-08-14
  • 打赏
  • 举报
回复

begin
declare i int; 
declare numareaId int(10); 
declare currentareaId int(10); 

SELECT COUNT(areaId),MIN(areaId) INTO @a,@b FROM option_area_info; 

SET numareaId=@a; 
SET currentareaId=@b; 
  
loop1:WHILE numareaId>0 DO 
SET @AID = currentareaId; 

SET i=1; 

loop2:while i<8 do 

select count(1) into @c from statistics_player_l where createTime>=date_sub(curdate(),interval i day) and createTime<date_sub(curdate(),interval i-1 day) and 

areaId=@AID;

if @c > 0 then

select count(distinct playerId) into @tmp  from log_login where registerTime=date_sub(curdate(),interval i day) and loginTime>=date_add(date_sub(curdate(),interval i 

day),interval 1 day) and loginTime<date_add(date_sub(curdate(),interval i day),interval 2 day) and areaId=@AID;

select count(distinct playerId) into @total from log_login where registerTime=date_sub(curdate(),interval i day);


update statistics_player_l set oneDayPlayer=(@tmp/@total*100) where createTime>=date_sub(curdate(),interval i day) and createTime<date_sub(curdate(),interval i-1 day); 

......

end if; 

SET i=i+1; 
end while loop2;   

SET numareaId=numareaId-1; 
SET currentareaId=currentareaId+1;   
END WHILE loop1;   

end
把代码修改一下,然后调试,监控查询结果,就知道更新的问题所在!
ACMAIN_CHM 2013-08-14
  • 打赏
  • 举报
回复
建议提供完整的测试数据和create procedure语句 建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382 1. 你的 create table xxx .. 语句 2. 你的 insert into xxx ... 语句 3. 结果是什么样,(并给以简单的算法描述) 4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
无敌小贱 2013-08-14
  • 打赏
  • 举报
回复
引用 9 楼 DBA_Huangzj 的回复:
要不先把你的表结构、业务情况描述清楚一点,最好有一些能测试的数据,我抽空尝试给你谢谢sqlserver版本的,因为我不动mysql。。。或者你等mysql专区的人来帮你
这个一张表一百多列啊.....而且数据有点多。不好给,业务就是算留存率 次日留存就是:新注册用户在首登后的次日再次登录游戏的比例 三日留存就是:新注册用户在首登后的第三天再次登录游戏的比例 这样依次类推七天。文档也就给了我这点信息。
發糞塗牆 2013-08-14
  • 打赏
  • 举报
回复
要不先把你的表结构、业务情况描述清楚一点,最好有一些能测试的数据,我抽空尝试给你谢谢sqlserver版本的,因为我不动mysql。。。或者你等mysql专区的人来帮你
无敌小贱 2013-08-14
  • 打赏
  • 举报
回复
引用 7 楼 DBA_Huangzj 的回复:
好像没有必要用循环,直接把日期带出来,然后再计算,不过很难表达清楚
但是我有好几个区啊,每个区都要查的。不用循环怎么搞?写三个这样的update块?
發糞塗牆 2013-08-14
  • 打赏
  • 举报
回复
好像没有必要用循环,直接把日期带出来,然后再计算,不过很难表达清楚
无敌小贱 2013-08-14
  • 打赏
  • 举报
回复
引用 5 楼 DBA_Huangzj 的回复:
你这个没数据比较难调试,而且还是mysql的,你试试把update改成select看看是不是你想要的,如果是再update
我这个是统计的用户七日留存率。我只能想到这个办法了。查出来的都对,但是修改的好像只是最后一遍才修改,也就把三区的玩家数据给修改到12区了。所以我想是循环结构的问题。如果这个不好整的话您有更好的方法推荐一下么?
發糞塗牆 2013-08-14
  • 打赏
  • 举报
回复
你这个没数据比较难调试,而且还是mysql的,你试试把update改成select看看是不是你想要的,如果是再update
无敌小贱 2013-08-14
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
你那堆UPDATE先屏蔽,然后单纯select 出变量,看看是否赋值有问题
变量就一个i和@AID 我看了一下,每次的变化都是正确的。i分别是1,2,3,4,5,6,7 @AID分别是1,2,3。大哥看看我是不是循环的结构有问题?
發糞塗牆 2013-08-14
  • 打赏
  • 举报
回复
你那堆UPDATE先屏蔽,然后单纯select 出变量,看看是否赋值有问题
无敌小贱 2013-08-14
  • 打赏
  • 举报
回复
引用 1 楼 wwwwgou 的回复:
这不是SQL SERVER,转到其它区吧
好吧.....但是我就看到oracle和ms sql啊
Shawn 2013-08-14
  • 打赏
  • 举报
回复
这不是SQL SERVER,转到其它区吧

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧