![](/img/trans.png)
[英]mysql stored procedure, select max value and insert the value and assign to variable
[英]MySQL Stored Procedure with Insert Select and user variable
问题:我有一个MySQL存储过程,我想在每次调用该过程时将用户变量重置为0,但是该变量似乎正在记住上一次运行时的值,因此我无法将其初始化为零。
详细信息:我有一个数据表(称为data
),可以从中读取该数据表,然后在另一个表(称为results
)中以1对1的相关关系生成记录。 我在利用插入选择语句的存储过程中执行此操作。 我还使用了一个用户变量@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
工作,只是我每次运行时都需要@mycount
重置为零,并且上面的SET
语句无法实现该目的。 调试时,我可以看到在存储过程的上一次运行中始终会记住@mycount
的最后一个值。 我也尝试在插入后将其设置为零。
笔记:
@
变量来递增并跟踪行号。 也许这里还有另一种选择? 问题:为什么每次运行前我@mycount
设置为零? 如果正在重置,并且仅仅是我的Haveing子句导致意外计数,是否有更好的方法重写SQL?
我希望有人遇到类似的情况,因为这似乎很晦涩。
我认为您正在使用会话变量(即@mycount)。请在下面的网站上查看您的答案
我找不到您的代码不起作用的任何原因。 无论如何,请尝试以下方法。
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;
在下面的SQL Fiddle中,我无法重现您提出的问题,理论上可以按预期工作。
UPDATE
尝试:
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 ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.