首页 > 解决方案 > MySQL变量分配通过过程不正常工作

问题描述

在下面的代码中,我尝试endDateTable逐行查看结果,将当前行endDate与前一行的endDate. 如果自上次以来有任何变化,我们增加@revisionNum. 但是,在填充新表时,所有@revisionNum条目都是0. 我究竟做错了什么?

注意:我以这种方式使用准备好的语句,因为直接SELECT进入变量会导致语法错误,因为LIMIT在我们的 MySQL 版本中该子句不允许变量。

BEGIN

 DECLARE _currentEndDate DATETIME DEFAULT now();
 DECLARE _priorEndDate DATETIME DEFAULT now();

 SET @ResultsCount = (SELECT COUNT(*) FROM mainTable);

 SET @j = 0;
    WHILE @j < @ResultsCount DO

        SET @revisionNum = 0;

        /*CURRENT END DATE*/
        SET @appResultQueryCurrent = CONCAT('
            SELECT 
                end_date
            INTO _currentEndDate
            FROM endDateTable 
            LIMIT ', @j, ', 1'
        );      

        PREPARE currentQueryStmt FROM @appResultQueryCurrent;
        EXECUTE currentQueryStmt;

        /*PREVIOUS END DATE*/
        SET @appResultQueryPrior = CONCAT('
            SELECT
                end_date
            INTO _priorAppEndDate
            FROM endDateTable
            LIMIT ', IF(@j = 0, 0, @j - 1), ', 1'
        );

        PREPARE priorQueryStmt FROM @appResultQueryPrior;
        EXECUTE priorQueryStmt; 

        SET @revisionNum = IF(
                @j = 0 OR (_currentEndDate = _priorEndDate),
                @revisionNum,
                IF(
                    _currentEndDate != _priorEndDate,
                    @revisionNum + 1,
                    @revisionNum
                )
            );

        INSERT INTO finalTable (RevisionNum)
        SELECT 
            @revisionNum AS RevisionNum 
        FROM endDateTable;

    SET @j = @j +1;

 END WHILE;

END $$

标签: mysqlloopsvariablesstored-proceduresprepared-statement

解决方案


您不需要循环,您可以使用INSERT INTO ... SELECT ...,增加选择查询中的变量。

您还需要一个ORDER BY标准来指定在将一行与前一行进行比较时如何对行进行排序。

INSERT INTO finalTable (RevisionNum, otherColumn)
SELECT revision, otherColumn
FROM (
    SELECT IF(end_date = @prev_end_date, @revision, @revision := @revision + 1) AS revision,
            @prev_end_date := end_date,
            otherColumn
    FROM endDateTable
    CROSS JOIN (SELECT @prev_end_date := NULL, @revision := -1) AS vars
    ORDER BY id) AS x

演示


推荐阅读