【问题标题】:MySQL stored proc WHILE give only last resultMySQL 存储过程 WHILE 只给出最后一个结果
【发布时间】:2012-09-11 16:25:48
【问题描述】:

我想为两个日期(@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 ;

感谢您的帮助。 丹尼尔

【问题讨论】:

    标签: mysql sql stored-procedures while-loop


    【解决方案1】:

    您应该使用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 ;
    

    【讨论】:

    • 太好了,谢谢你帮了我:-)
    【解决方案2】:

    您应该尝试使用临时表。这是关于它的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 ;
    

    【讨论】:

      猜你喜欢
      • 2013-09-18
      • 1970-01-01
      • 2016-04-14
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      相关资源
      最近更新 更多