MySQL存储的proc WHILE只给出最后的结果

时间:2012-09-19 11:01:00

标签: mysql sql stored-procedures while-loop

我想提取两个日期之间每个日期的计数(@ sdate,@ edate),但它只给出了最后一天的计数,而不是所有日期。

我如何输出所有结果?这是我的存储过程。

DELIMITER $$
USE `cmd_storeinfo`$$
DROP PROCEDURE IF EXISTS `test2`$$
CREATE DEFINER=`USER`@`%` PROCEDURE `test2`()
BEGIN
  SET @sdate = (DATE_SUB(CURDATE(), INTERVAL 6 MONTH));
  SET @edate = (CURDATE());
  SET @x='';
  SET @Y='';
    WHILE @sdate <= @edate DO
       SELECT COUNT(*) INTO @y
       FROM cmd_storeinfo.strinfo 
       WHERE LiveDate <= @sdate AND DeinstallDate >= @sdate OR DeinstallDate IS
             NULL AND LiveDate IS NOT NULL
             AND CHAIN != 1 && CHAIN != 2 && CHAIN != 999
       GROUP BY @sdate
         SET @x = @sdate;
         SET @sdate = (DATE_ADD(@sdate, INTERVAL 1 DAY));
   END WHILE;
SELECT @x,@y;
END$$
DELIMITER ;

谢谢你的帮助。 丹尼尔

2 个答案:

答案 0 :(得分:0)

您应该尝试使用临时表。这是关于它的nice answer

这样的事情可行:

DELIMITER $$
USE `cmd_storeinfo`$$
DROP PROCEDURE IF EXISTS `test2`$$
CREATE DEFINER=`USER`@`%` PROCEDURE `test2`()
BEGIN
  CREATE TEMPORARY TABLE tmpTable (currentDate DATE, startDate INT);

  SET @sdate = (DATE_SUB(CURDATE(), INTERVAL 6 MONTH));
  SET @edate = (CURDATE());
  SET @x='';
  SET @Y='';
    WHILE @sdate <= @edate DO
       INSERT INTO tmpTable (currentDate, startDate)
       SELECT @sdate, COUNT(*)
       FROM cmd_storeinfo.strinfo 
       WHERE LiveDate <= @sdate AND DeinstallDate >= @sdate OR DeinstallDate IS
             NULL AND LiveDate IS NOT NULL
             AND CHAIN != 1 && CHAIN != 2 && CHAIN != 999
       GROUP BY @sdate
         SET @sdate = (DATE_ADD(@sdate, INTERVAL 1 DAY));
   END WHILE;
SELECT * FROM tmpTable;

DROP TEMPORARY TABLE IF EXISTS tmpTable;
END$$
DELIMITER ;

答案 1 :(得分:0)

您应该使用Temporary table来存储所有值。

DELIMITER $$
USE `cmd_storeinfo`$$
DROP PROCEDURE IF EXISTS `test2`$$
CREATE DEFINER=`USER`@`%` PROCEDURE `test2`()
BEGIN
  SET @sdate = (DATE_SUB(CURDATE(), INTERVAL 6 MONTH));
  SET @edate = (CURDATE());
  SET @x='';
  SET @Y='';
  CREATE TEMPORARY TABLE tmpTable (x datetime,y bigint); -- creating tmp table
    WHILE @sdate <= @edate DO
       SELECT COUNT(*) INTO @y
       FROM cmd_storeinfo.strinfo 
       WHERE LiveDate <= @sdate AND DeinstallDate >= @sdate OR DeinstallDate IS
             NULL AND LiveDate IS NOT NULL
             AND CHAIN != 1 && CHAIN != 2 && CHAIN != 999
       GROUP BY @sdate

         SET @x = @sdate;
         insert into tmpTable (x,y) values (@x,@y); -- inserting values
         SET @sdate = (DATE_ADD(@sdate, INTERVAL 1 DAY));
   END WHILE;
SELECT x,y from tmpTable order by x; -- output temp table results
END$$
DELIMITER ;