在MySql存储过程中循环错误代码1064

时间:2013-10-17 15:28:20

标签: mysql stored-procedures

我是编写MySQL存储过程的新手,我正试图利用循环和变量。

我有一个名为STAT_NAME的列表,其中多行可以具有该列的相同值。我想创建一个临时列,对每个STAT_NAME值的出现次数进行编号,例如,第一次STAT_NAME为“stat A”,将STAT_COUNT设置为1,第二次为2等。然后再次从1开始为“stat B”和等等。

我已经创建了一个名为STAT_COUNT的空列的临时表,并按照STAT_NAME对表进行了排序。

然后我尝试遍历所有行并相应地设置STAT_COUNT。但是,我收到以下错误:

错误代码:1064。您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在'@ counting,1)附近使用正确的语法然后设置@STAT_NAME_CURR =(SELECT @STAT_NAME FROM tmp1 LIMIT @'

有人能够解释为什么我写的不行吗?我认为如果我使用系统变量而不是@counting会好的,我不明白为什么。我试过谷歌搜索问题,但没有到达任何地方!

欢呼声。

DROP PROCEDURE IF EXISTS collate_stats;
delimiter //
CREATE PROCEDURE collate_stats()
begin

create temporary table tmp1 engine=memory 
SELECT STAT_NAME, STAT, '' AS STAT_COUNT
FROM performance_testing_stats.20131014
ORDER BY STAT_NAME;

-- stat name that we are currently looking at
SET @STAT_NAME_CURR := "";
-- number of times this name has been found so far
SET @STAT_NAME_COUNT := 0;

-- Use to loop through all rows
SET @n := (SELECT COUNT(*) FROM tmp1);

-- Row reached so far
SET @counting := 0;
WHILE @counting < @n DO

    -- IF @STAT_NAME_CURR is not equal to the STAT_NAME for the current row,
    -- THEN set @STAT_NAME_CURR to STAT_NAME value and reset @STAT_NAME_COUNT
    -- ELSE just increment @STAT_NAME_COUNT
     IF @STAT_NAME_CURR <> (SELECT @STAT_NAME FROM tmp1 LIMIT @counting,1) THEN
        SET @STAT_NAME_CURR = (SELECT @STAT_NAME FROM tmp1 LIMIT @counting,1);
        SET @STAT_NAME_COUNT = 0;
    ELSE
        SET @STAT_NAME_COUNT = @STAT_NAME_COUNT + 1;
    END IF;

    -- Set STAT_COUNT for current row to value of @STAT_NAME_COUNT
    UPDATE tmp1 SET STAT_COUNT = @STAT_NAME_COUNT WHERE STAT_NAME = @STAT_NAME_CURR AND STAT_COUNT = '' LIMIT 1;

    -- Move to next row
    SET @counting = @counting + 1;
END WHILE;

select * from tmp1;

END //

delimiter ;

1 个答案:

答案 0 :(得分:1)

您可能希望使用游标而不是while循环。

但是,您可以使用简单的GROUP BY查询来完成您尝试执行的操作:

SELECT STAT_NAME, STAT, COUNT(1) as STAT_COUNT
FROM performance_testing_stats.20131014
GROUP BY STAT_NAME, STAT
ORDER BY STAT_NAME, STAT;

除非我遗漏了你正在做的事情。