2

问题: 我有一个 MySQL 存储过程,我想在每次调用该过程时将用户变量重置为 0,但该变量似乎在每次运行时都记住了它的值,我无法将其初始化为零。

详细信息:我有一个数据表(称为),我从中读取数据表,然后在另一个表(称为)data中以一对一的关联生成记录。results我在使用 Insert Select 语句的存储过程中执行此操作。我还使用了一个@mycount随每一行递增的用户变量。这是我的代码的简化版本:

DELIMITER //
CREATE PROCEDURE doSomething
BEGIN
    SET @mycount := 0;
    INSERT INTO results (data_id, mycounter)
        SELECT data.id, (@mycount := @mycount+1)
        FROM data LEFT JOIN results ON data.id = results.data_id
        WHERE ... GROUP BY ...
        HAVING ...
        ORDER BY ...;
END //
DELIMITER ;

分析:这几乎可以按预期工作,除非我@mycount每次运行时都需要将其重置为零并且SET上面的语句没有实现这一点。调试时,我可以看到最后一个值@mycount总是从存储过程的上一次运行中记住的。我也尝试在插入后将其设置为零。

笔记:

  1. 我正在使用一个@变量来增加和跟踪行号。也许这里还有另一种选择?
  2. 这个问题似乎与 Have 子句有关。当我运行一个类似但不同的查询时,没有使用 having 子句,变量重置没有问题。

问题:@mycount为什么每次运行前不能设置为零?如果它正在重置并且只是我的Having 子句导致意外计数,是否有更好的方法来重写我的SQL?

我希望有人遇到过类似的事情,因为这看起来很模糊。

4

3 回答 3

2

我认为您正在使用会话变量(即@mycount)。检查下面的站点,您将得到答案

MySQL:@variable 与变量。有什么不同?

于 2013-08-11T10:54:38.783 回答
0

我找不到您的代码无法正常工作的任何原因。不管怎样,试试下面的方法。

INSERT INTO results (data_id, mycounter)
select a.id, a.cnt from (
select @mycount := 0 from dual
join ( SELECT data.id, (@mycount := @mycount+1) cnt
        FROM data LEFT JOIN results ON data.id = results.data_id
        WHERE ... GROUP BY ...)) a;

在这种情况下,您不需要指定SET @mycount := 0;

于 2013-08-10T10:54:06.797 回答
0

In the following SQL Fiddle I can not reproduce the problem you pose, in theory works as expected.

UPDATE

Try:

DELIMITER //

CREATE PROCEDURE doSomething()
BEGIN
    SET @mycount := 0;
    INSERT INTO results (data_id, mycounter)
        SELECT der.id, (@mycount := @mycount + 1)
        FROM (
            SELECT data.id
            FROM data
                LEFT JOIN results ON data.id = results.data_id
            WHERE ...
            GROUP BY ...
            HAVING ...
            ORDER BY ...
        ) der;
END //

DELIMITER ;
于 2013-08-10T11:07:42.523 回答