在存储过程mysql中得到错误的结果

在存储过程mysql中得到错误的结果,mysql,stored-procedures,Mysql,Stored Procedures,我尝试使用SP获取每个日期的结果&我使用循环并使用union all追加sql语句,但它正在提取变量date的最后一个值 表格: CREATE TABLE `bugs` ( `id` int(11) DEFAULT NULL, `severity` int(11) DEFAULT NULL, `open_date` date DEFAULT NULL, `close_date` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=u

我尝试使用SP获取每个日期的结果&我使用循环并使用union all追加sql语句,但它正在提取变量date的最后一个值

表格:

CREATE TABLE `bugs` (
  `id` int(11) DEFAULT NULL,
  `severity` int(11) DEFAULT NULL,
  `open_date` date DEFAULT NULL,
  `close_date` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DELIMITER $$
 DROP PROCEDURE IF EXISTS search$$
 CREATE PROCEDURE search(startDate DATE, endDate DATE)
     BEGIN
         DECLARE result  VARCHAR(255);
         SET @iterDate = DATE(startDate);
         SET @result = '';
         label1: LOOP
            SET @result = CONCAT(@result, ' SELECT DATE(@iterDate), count(*) FROM bugs WHERE open_date = DATE(@iterDate) AND close_date > DATE(@iterDate) UNION ALL');
            SET @iterDate = DATE_ADD(@iterDate, INTERVAL 1 DAY);
            IF @iterDate <= DATE(endDate) THEN
                ITERATE label1;
            END IF;
            LEAVE label1;
         END LOOP label1;
         SET @result = LEFT(@result, LENGTH(@result)-LENGTH('UNION ALL'));
         PREPARE stmt FROM @result;
         EXECUTE stmt;
    END$$
DELIMITER ;
SP:

CREATE TABLE `bugs` (
  `id` int(11) DEFAULT NULL,
  `severity` int(11) DEFAULT NULL,
  `open_date` date DEFAULT NULL,
  `close_date` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DELIMITER $$
 DROP PROCEDURE IF EXISTS search$$
 CREATE PROCEDURE search(startDate DATE, endDate DATE)
     BEGIN
         DECLARE result  VARCHAR(255);
         SET @iterDate = DATE(startDate);
         SET @result = '';
         label1: LOOP
            SET @result = CONCAT(@result, ' SELECT DATE(@iterDate), count(*) FROM bugs WHERE open_date = DATE(@iterDate) AND close_date > DATE(@iterDate) UNION ALL');
            SET @iterDate = DATE_ADD(@iterDate, INTERVAL 1 DAY);
            IF @iterDate <= DATE(endDate) THEN
                ITERATE label1;
            END IF;
            LEAVE label1;
         END LOOP label1;
         SET @result = LEFT(@result, LENGTH(@result)-LENGTH('UNION ALL'));
         PREPARE stmt FROM @result;
         EXECUTE stmt;
    END$$
DELIMITER ;
分隔符$$
删除过程(如果存在)搜索$$
创建过程搜索(开始日期、结束日期)
开始
声明结果VARCHAR(255);
设置@iterDate=日期(startDate);
设置@result='';
标签1:环
设置@result=CONCAT(@result,'选择日期(@iterDate),从打开日期=日期(@iterDate)和关闭日期>日期(@iterDate)的bug中计数(*);
设置@iterDate=DATE\u ADD(@iterDate,间隔1天);

如果@iterDate只需更改@iterDate递增(SET命令)和@iterDate条件检查(IF命令)的顺序即可。

这将使循环无限。您现在无权尝试,但可以在迭代之前在IF块中添加递增项。。它会工作吗?是的,但它最终是更新值,而不是在追加时,所以它采用endate+1。你知道这里出了什么问题吗?我用一个日历表和一个左连接来代替一个过程。