編輯:已經解決並回答:但如果您有類似問題,請隨時閱讀並查看過程如何進行
背景 我創建了一個名為“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)
。