问题描述
我正在尝试以下 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