编辑:已经解决并回答:但如果您有类似问题,请随时阅读并查看过程如何进行
背景 我创建了一个名为“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 ;
所有结果都没有治愈或成本
个人结果与治疗和成本
最终正确的查询结果
UNION
有其缺点,例如无法使用ORDER BY
子句进行排序。此外,如果您决定继续,则在本例中总共需要使用 17 个UNION
,这使得查询过于拖沓。我建议使用结果表并将您的程序sea_dew_potion
插入其中。然后您可以查询结果表,并可能在导出到tableau
表之前进行一些调整。最后,作为旁注,我们可以为sea_dew_potion
过程添加一个计数参数,而不是在循环中调用sea_dew_potion
18 次,这样我们只需要定义计数并运行该过程一次。例如sea_dew_potion(p1,p2,p3,p4,p5,count_num int)
。