EDIT : Déjà résolu et répondu : Mais si vous avez une question similaire, n'hésitez pas à lire et à voir comment fonctionne le processus
Contexte J'ai créé une procédure appelée "sea_dew_potion" et l'ai placée dans une boucle appelée "loopseadew". La boucle fonctionne comme prévu.
Question
Ma boucle produit 18 résultats, mais je souhaite qu'elle soit dans un seul ensemble de résultats afin de pouvoir l'exporter vers un tableau pour créer un graphique linéaire avec plusieurs points de données, formant ainsi une forme de courbe. Après quelques recherches, je pense que UNION
pourrait fonctionner, mais je ne sais pas comment le faire, principalement parce que je suis juste en train de comprendre comment fonctionne la boucle et ensuite comment installer un autre processus à l'intérieur de la boucle haha. Merci pour votre aide!
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 ;
EDIT : J'ai fait quelques progrès, mais j'obtiens des valeurs nulles pour les colonnes "heal" et "cost". Les valeurs de traitement sont générées par le programme "sea_dew_potion". J'ai maintenant 18 résultats individuels où toutes les valeurs sont correctes, et un résultat qui est une combinaison de tous les résultats mais avec des valeurs vides pour le traitement et le coût. La capture d'écran en bas montre le problème entre les jeux de résultats.
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 ;
Modifier la partie 2 Merci à @blabla_bingo, j'ai enfin compris ! C'est la requête ultime pour toute personne intéressée haha
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 ;
Tous les résultats sans remède ni coût
Résultats personnels par rapport au traitement et au coût
Le résultat final de la requête correcte
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)
。