在 mysql 中分配用户声明的变量而循环结果为空

问题描述

我正在尝试以下 MysqL 函数,其中包含一个 while 循环。

BEGIN
    SET @total := 5000;
    SET @count := 1;
    SET @total := (SELECT price from item_prices WHERE id=SUBSTRING_INDEX(items,";",1));
    INSERT INTO mytest values (SUBSTRING_INDEX(items,1),(SELECT price from item_prices WHERE id=SUBSTRING_INDEX(items,1)));
    WHILE items != SUBSTRING_INDEX(items,@count) DO
    
        SET @count := @count + 1;
        SET @temp := (SELECT price from item_prices WHERE id=SUBSTRING_INDEX(SUBSTRING_INDEX(items,@count),-1));
        SET @total := @total + @temp;
        INSERT INTO mytest values (SUBSTRING_INDEX(SUBSTRING_INDEX(items,-1),(SELECT price from item_prices WHERE id=SUBSTRING_INDEX(SUBSTRING_INDEX(items,-1)));
    END WHILE;
    RETURN @total;
END;

我使用 mytest 表来调试我的值。当我调试时,我可以看到我的 SELECT 查询在所有情况下都返回正确的值。但是,在某些情况下,我的 @total 变量会转换为 NULL。 例如:我传递字符串 "1;2;14"

@total = 100
@count = 2,@temp = 200,@total = 300
@count = 3,@temp = 50,@total = NULL

Eg2:I pass String "1;14;15"
val1 = 100,@total = NULL
@count = 2,@total = NULL
@count = 3,@temp = 75,@total = NULL

此外,我可以看到,@total 在某个点之后获得 NULL 并保持 NULL,即使是稍后对该函数调用也是如此。有人可以解释我这里的理论吗?我应该清除函数末尾的变量吗?

更新: 我的完整计划:

DROP FUNCTION IF EXISTS get_total;
CREATE FUNCTION get_total(items VARCHAR(45)) RETURNS INT DETERMINISTIC
BEGIN

    SET @total := 5000;
    SET @count := 1;
    SET @total := (SELECT price from item_prices WHERE id=SUBSTRING_INDEX(items,1));
    #INSERT INTO mytest values (SUBSTRING_INDEX(items,@total);
    WHILE items != SUBSTRING_INDEX(items,-1));
        SET @total := @total + @temp;
        #INSERT INTO mytest values (SUBSTRING_INDEX(SUBSTRING_INDEX(items,@total);
    END WHILE;
    RETURN @total;
END;

CREATE PROCEDURE orderPrices()
BEGIN
    SELECT id,buyer,get_total(items) AS total_price
    FROM orders
    ORDER BY id;
END;

样本输入:

orders

id  buyer           items
1   Justin Penrose  1
2   Bertha Neiman   1;2;14
3   John Doe        1;14;15

item_prices

id  price
1   100
2   200
3   500
4   250
14  50
15  75
16  100

函数接收一个 ; 单独的项目 id 列表, 我的函数尝试做的是将每个 id 与 ';' 分开,从价格表中检索相关价格并返回总价。

解决方法

这个任务可以通过一个简单的查询来解决:

SELECT orders.id,orders.buyer,SUM(item_prices.price) total_price
FROM orders
JOIN item_prices ON FIND_IN_SET(item_prices.id,REPLACE(orders.items,';',','))
GROUP BY orders.id,orders.buyer
ORDER BY id

fiddle