EDIT: Sudah diselesaikan dan dijawab: Tetapi jika anda mempunyai soalan yang sama, sila baca dan lihat bagaimana proses itu berfungsi
Latar belakang Saya mencipta prosedur yang dipanggil "sea_dew_potion" dan meletakkannya di dalam gelung yang dipanggil "loopseadew". Gelung berfungsi seperti yang diharapkan.
Soalan
Gelung saya menghasilkan 18 hasil, tetapi saya mahu ia berada dalam set hasil tunggal supaya saya boleh mengeksportnya ke tableau untuk membuat carta garis dengan berbilang titik data, sekali gus membentuk beberapa bentuk lengkung. Selepas beberapa penyelidikan, saya fikir UNION
boleh berfungsi, tetapi saya tidak pasti bagaimana untuk melakukannya, terutamanya kerana saya hanya memikirkan cara gelung berfungsi dan kemudian cara memasang proses lain di dalam gelung haha. terima kasih atas bantuan anda!
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: Saya telah membuat sedikit kemajuan, tetapi saya mendapat nilai batal untuk lajur "sembuh" dan "kos". Nilai rawatan dijana oleh program "sea_dew_potion". Sekarang saya mempunyai 18 keputusan individu di mana semua nilai adalah betul, dan satu keputusan yang merupakan gabungan semua keputusan tetapi dengan nilai kosong untuk rawatan dan kos. Tangkapan skrin di bahagian bawah menunjukkan isu antara set hasil.
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 ;
Edit Bahagian 2 Jerit kepada @blabla_bingo, akhirnya saya faham! Ini adalah pertanyaan muktamad untuk sesiapa yang berminat 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 ;
Semua hasil tanpa penawar atau kos
Hasil Peribadi lwn Rawatan dan Kos
Hasil pertanyaan akhir yang betul
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)
。