recherche

Maison  >  Questions et réponses  >  le corps du texte

MySQL : combiner tous les résultats dans une boucle (éventuellement en utilisant UNION ?)

EDIT : Déjà résolu et répondu : Mais si vous avez une question similaire, n'hésitez pas à lire et à voir comment fonctionne le processus

Contexte J'ai créé une procédure appelée "sea_dew_potion" et l'ai placée dans une boucle appelée "loopseadew". La boucle fonctionne comme prévu.

Question Ma boucle produit 18 résultats, mais je souhaite qu'elle soit dans un seul ensemble de résultats afin de pouvoir l'exporter vers un tableau pour créer un graphique linéaire avec plusieurs points de données, formant ainsi une forme de courbe. Après quelques recherches, je pense que UNION pourrait fonctionner, mais je ne sais pas comment le faire, principalement parce que je suis juste en train de comprendre comment fonctionne la boucle et ensuite comment installer un autre processus à l'intérieur de la boucle haha. Merci pour votre aide!

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 : J'ai fait quelques progrès, mais j'obtiens des valeurs nulles pour les colonnes "heal" et "cost". Les valeurs de traitement sont générées par le programme "sea_dew_potion". J'ai maintenant 18 résultats individuels où toutes les valeurs sont correctes, et un résultat qui est une combinaison de tous les résultats mais avec des valeurs vides pour le traitement et le coût. La capture d'écran en bas montre le problème entre les jeux de résultats.

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 ;

Modifier la partie 2 Merci à @blabla_bingo, j'ai enfin compris ! C'est la requête ultime pour toute personne intéressée 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 ;

Tous les résultats sans remède ni coût

Résultats personnels par rapport au traitement et au coût

Le résultat final de la requête correcte

P粉897881626P粉897881626286 Il y a quelques jours376

répondre à tous(1)je répondrai

  • 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)

    répondre
    0
  • Annulerrépondre