编辑:已经解决并回答:但如果您有类似问题,请随时阅读并查看过程如何进行
背景 我创建了一个名为“sea_dew_potion”的过程,并将其放置在一个名为“loopseadew”的循环中。循环按预期工作。
问题
我的循环产生了 18 个结果,但我希望它位于单个结果集中,以便我可以将其导出到 tableau 以制作具有多个数据点的折线图,从而形成某种形式的曲线。经过一番研究后,我认为 UNION 可以工作,但我不确定如何去做,主要是因为我只是弄清楚循环是如何工作的,然后如何在循环中安装另一个过程哈哈。感谢您的帮助!
DELIMITER $$
CREATE PROCEDURE loopseadew(IN p_base_name VARCHAR(255), IN p_base_amount integer, IN p_ing_name VARCHAR(255), p_ing_amount integer, p_pot_units INTEGER(3))
BEGIN
DECLARE p_ing_amount int;
SET p_ing_amount = 0;
loop1: LOOP
SET p_ing_amount = p_ing_amount + 1;
CALL sea_dew_potion('sea dew', 100, 'skadite', 0, 10);
IF p_ing_amount = 18 THEN
LEAVE loop1;
END IF;
END LOOP loop1;
SELECT p_base_name, p_base_amount, p_ing_name, p_ing_amount,
m.price * p_ing_amount AS cost
FROM
multiplier m
WHERE
m.ing_name = p_ing_name;
END$$
DELIMITER ;
编辑:我取得了一些进展,但我得到“heal”和“cost”列的空值。治疗值由程序“sea_dew_potion”产生。现在我得到了 18 个单独的结果,其中所有的值都是正确的,还有一个结果是所有结果的组合,但治疗和成本的值为空。 底部的屏幕截图显示了结果集之间的问题。
DELIMITER $$
CREATE PROCEDURE allloopseadew(IN p_base_name VARCHAR(255), IN p_base_amount integer, IN p_ing_name VARCHAR(255), p_ing_amount integer, p_pot_units INTEGER(3))
BEGIN
DECLARE x int;
CREATE TEMPORARY TABLE allresults (p_base_name varchar(255), p_base_amount int(3), p_ing_name VARCHAR(255), p_ing_amount int(3), heal decimal(10,2), cost decimal(10,2));
SET x = 0;
loop1: LOOP
SET x = x + 1;
CALL sea_dew_potion('sea dew', 100, 'skadite', x, 10);
IF x = 18 THEN
LEAVE loop1;
END IF;
INSERT INTO allresults
VALUES(p_base_name, p_base_amount, p_ing_name , x, heal, cost);
END LOOP loop1;
SELECT p_base_name, p_base_amount, p_ing_name, p_ing_amount,
m.price * p_ing_amount AS cost
FROM
multiplier m
WHERE
m.ing_name = p_ing_name;
SELECT * FROM allresults;
END$$
DELIMITER ;
编辑第 2 部分 向@blabla_bingo 大声喊叫,我终于明白了!这是感兴趣的人的最终查询哈哈
CREATE PROCEDURE allloopseadew(IN p_base_name VARCHAR(255), IN p_base_amount integer, IN p_ing_name VARCHAR(255), p_ing_amount integer, p_pot_units INTEGER(3))
BEGIN
DECLARE x decimal(10,3);
DECLARE v_heal decimal(10,3);
DECLARE v_cost decimal(10,3);
DECLaRE v_total_amount int(3);
CREATE TEMPORARY TABLE allresults (p_base_name varchar(255), p_base_amount int(3), p_ing_name VARCHAR(255), p_ing_amount int(3), heal decimal(10,2), cost decimal(10,2));
SET x = 0;
loop1: LOOP
SET x = x + 1;
SET v_total_amount =
(SELECT p_base_amount + x);
SET v_heal =
(SELECT
round(max((2*(2.1*(p_base_amount/v_total_amount))*1*(1+sqrt(x/v_total_amount)*m.multiplier_value)*p_pot_units)),3)
FROM
multiplier m
WHERE
m.ing_name = p_ing_name);
SET v_cost =
(SELECT
m.price * x
FROM
multiplier m
WHERE
m.ing_name = p_ing_name);
CALL sea_dew_potion('sea dew', 100, 'skadite', x, 10);
IF x = 18 THEN
LEAVE loop1;
END IF;
INSERT INTO allresults
VALUES(p_base_name, p_base_amount, p_ing_name, x, v_heal, v_cost);
END LOOP loop1;
SELECT p_base_name, p_base_amount, p_ing_name, p_ing_amount,
m.price * p_ing_amount AS cost
FROM
multiplier m
WHERE
m.ing_name = p_ing_name;
SELECT * FROM allresults;
END$$
DELIMITER ;
所有结果都没有治愈或成本
个人结果与治疗和成本
最终正确的查询结果
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
UNION有其缺点,例如无法使用ORDER BY子句进行排序。此外,如果您决定继续,则在本例中总共需要使用 17 个UNION,这使得查询过于拖沓。我建议使用结果表并将您的程序sea_dew_potion插入其中。然后您可以查询结果表,并可能在导出到tableau表之前进行一些调整。最后,作为旁注,我们可以为sea_dew_potion过程添加一个计数参数,而不是在循环中调用sea_dew_potion18 次,这样我们只需要定义计数并运行该过程一次。例如sea_dew_potion(p1,p2,p3,p4,p5,count_num int)。