![](/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.