BEGIN
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;insert into statistics_user_report(areaId,everOnlineTime,sumOnlineTime,avgOnlineTime,avgPayCount,hyPlayerCount,lcPlayerCount,createTime) values(
currentareaId,
(select sum(timestampdiff(minute,lastLoginTime,lastLogoutTime)) from log_logout where lastLoginTime >=current_date() and lastLoginTime<date_add(curdate(),interval 1 day) and areaId=@AID),
(select sum(timestampdiff(minute,lastLoginTime,lastLogoutTime)) from log_logout where areaId=@AID),
(select ((select sum(timestampdiff(hour,lastLoginTime,lastLogoutTime)) from log_logout where playerId in(SELECT playerId FROM log_logout WHERE (select sum(TIMESTAMPDIFF(HOUR,lastLoginTime,lastLogoutTime)) from log_logout)>=8 in (SELECT playerId FROM (SELECT playerId,WEEK(lastLoginTime) weekNo FROM log_logout where areaId=@AID) t GROUP BY t.playerId,t.weekNo HAVING COUNT(1) >= 3)))/(select count(1) from (SELECT playerId FROM (SELECT playerId,WEEK(current_date()) weekNo FROM log_logout where areaId=@AID) t GROUP BY t.playerId,t.weekNo HAVING COUNT(1) >= 3 in (select playerId from log_logout where (select sum(timestampdiff(hour,lastLoginTime,lastLogoutTime)) from log_logout)>=8 and areaId=@AID))t))),
(select ((select count(createTime) from log_input_ggold where createTime>=date_sub(curdate(),interval 7 day) and createTime<date_add(curdate(),interval 1 day) and areaId=@AID)/(select count(1) from (SELECT playerId FROM (SELECT playerId FROM log_logout where areaId=@AID and lastLoginTime>=date_sub(curdate(),interval 7 day) and lastLoginTime<date_add(curdate(),interval 1 day)) t GROUP BY t.playerId HAVING COUNT(1) >= 3 in (select playerId from log_logout where (select sum(timestampdiff(hour,lastLoginTime,lastLogoutTime)) from log_logout)>=8 and areaId=@AID))t)),
(select count(1) from (SELECT playerId FROM (SELECT playerId FROM log_logout where areaId=1 and lastLoginTime>=date_sub(curdate(),interval 7 day) and lastLoginTime<date_add(curdate(),interval 1 day)) t GROUP BY t.playerId HAVING COUNT(1) >= 3 in (select playerId from log_logout where (select sum(timestampdiff(hour,lastLoginTime,lastLogoutTime)) from log_logout)>=8 and areaId=1))t),
(select ((select count(1) from (SELECT playerId FROM (SELECT playerId FROM log_logout where areaId=@AID and lastLoginTime>=date_sub(curdate(),interval 14 day) and lastLoginTime<date_sub(curdate(),interval 7 day)) t GROUP BY t.playerId HAVING COUNT(1) >= 3 in (select playerId from log_logout where (select sum(timestampdiff(hour,lastLoginTime,lastLogoutTime)) from log_logout)>=8 and areaId=@AID))t) in (select count(1) from (SELECT playerId FROM (SELECT playerId FROM log_logout where areaId=@AID and lastLoginTime>=date_sub(curdate(),interval 7 day) and lastLoginTime<date_add(curdate(),interval 1 day)) t GROUP BY t.playerId HAVING COUNT(1) >= 3 in (select playerId from log_logout where (select sum(timestampdiff(hour,lastLoginTime,lastLogoutTime)) from log_logout)>=8 and areaId=@AID))t))t),
NOW());SET numareaId=numareaId-1;
SET currentareaId=currentareaId+1;END WHILE loop1;
END
存储SQL统计学

解决方案 »

  1.   

    END WHILE;
    end loop loop1;
      

  2.   

    自己看看
    SELECT ((SELECT COUNT(1) FROM (SELECT playerId FROM (SELECT playerId FROM log_logout WHERE areaId=@AID AND lastLoginTime>=DATE_SUB(CURDATE(),INTERVAL 14 DAY) AND lastLoginTime<DATE_SUB(CURDATE(),INTERVAL 7 DAY)) t GROUP BY t.playerId HAVING COUNT(1) >= 3 IN (SELECT playerId FROM log_logout WHERE (SELECT SUM(TIMESTAMPDIFF(HOUR,lastLoginTime,lastLogoutTime)) FROM log_logout)>=8 AND areaId=@AID))t) IN (SELECT COUNT(1) FROM (SELECT playerId FROM (SELECT playerId FROM log_logout WHERE areaId=@AID AND lastLoginTime>=DATE_SUB(CURDATE(),INTERVAL 7 DAY) AND lastLoginTime<DATE_ADD(CURDATE(),INTERVAL 1 DAY)) t GROUP BY t.playerId HAVING COUNT(1) >= 3 IN (SELECT playerId FROM log_logout WHERE (SELECT SUM(TIMESTAMPDIFF(HOUR,lastLoginTime,lastLogoutTime)) FROM log_logout)>=8 AND areaId=@AID))t))t),太长了,自行检查
      

  3.   

    第一个错误loop本来就是循环,和while用重了。
    第二个错误是HAVING COUNT(1) >= 3)))/这个地方,/前面多了一个括号,后面就没看了,你这个子查询太长了