MySQL:组合循环中的所有结果(可能使用 UNION?)
P粉897881626
P粉897881626 2024-02-17 15:31:33
0
1
395

编辑:已经解决并回答:但如果您有类似问题,请随时阅读并查看过程如何进行

背景 我创建了一个名为“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粉897881626
P粉897881626

全部回复(1)
P粉511757848

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)

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板