Heim > Fragen und Antworten > Hauptteil
EDIT: Bereits gelöst und beantwortet: Aber wenn Sie eine ähnliche Frage haben, lesen Sie gerne weiter und sehen Sie, wie der Prozess funktioniert
Hintergrund Ich habe eine Prozedur namens „sea_dew_potion“ erstellt und sie in eine Schleife namens „loopseadew“ eingefügt. Die Schleife funktioniert wie erwartet.
Frage
Meine Schleife erzeugt 18 Ergebnisse, aber ich möchte, dass sie in einem einzigen Ergebnissatz vorliegt, damit ich sie in Tableau exportieren kann, um ein Liniendiagramm mit mehreren Datenpunkten zu erstellen und so eine Art Kurve zu bilden. Nach einiger Recherche denke ich, dass UNION
funktionieren könnte, bin mir aber nicht sicher, wie ich das machen soll, hauptsächlich, weil ich nur herausfinden muss, wie die Schleife funktioniert und wie ich dann einen anderen Prozess innerhalb der Schleife installieren kann, haha. Vielen Dank für Ihre Hilfe!
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: Ich habe einige Fortschritte gemacht, aber ich erhalte Nullwerte für die Spalten „Heilung“ und „Kosten“. Behandlungswerte werden durch das Programm „sea_dew_potion“ generiert. Jetzt habe ich 18 Einzelergebnisse, bei denen alle Werte korrekt sind, und ein Ergebnis, das eine Kombination aller Ergebnisse ist, aber mit leeren Werten für Behandlung und Kosten. Der Screenshot unten zeigt das Problem zwischen den Ergebnissätzen.
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 ;
Teil 2 bearbeiten Grüße @blabla_bingo, ich habe es endlich herausgefunden! Das ist die ultimative Abfrage für alle Interessierten, 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 ;
Alle Ergebnisse ohne Heilung oder Kosten
Persönliche Ergebnisse vs. Behandlung und Kosten
Das endgültige richtige Abfrageergebnis
P粉5117578482024-02-18 00:19:05
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)
。