搜尋

首頁  >  問答  >  主體

MySQL:組合循環中的所有結果(可能使用 UNION?)

編輯:已經解決並回答:但如果您有類似問題,請隨時閱讀並查看過程如何進行

背景 我創建了一個名為“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 ;

所有結果都沒有治癒或成本

個人結果與治療和成本

最終正確的查詢結果

P粉897881626P粉897881626283 天前369

全部回覆(1)我來回復

  • P粉511757848

    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)

    回覆
    0
  • 取消回覆