suchen

Heim  >  Fragen und Antworten  >  Hauptteil

MySQL: Alle Ergebnisse in einer Schleife kombinieren (möglicherweise mit UNION?)

EDIT: Bereits gelöst und beantwortet: Aber wenn Sie eine ähnliche Frage haben, lesen Sie gerne weiter und sehen Sie, wie der Prozess funktioniert

Hintergrund Ich habe eine Prozedur namens „sea_dew_potion“ erstellt und sie in eine Schleife namens „loopseadew“ eingefügt. Die Schleife funktioniert wie erwartet.

Frage Meine Schleife erzeugt 18 Ergebnisse, aber ich möchte, dass sie in einem einzigen Ergebnissatz vorliegt, damit ich sie in Tableau exportieren kann, um ein Liniendiagramm mit mehreren Datenpunkten zu erstellen und so eine Art Kurve zu bilden. Nach einiger Recherche denke ich, dass UNION funktionieren könnte, bin mir aber nicht sicher, wie ich das machen soll, hauptsächlich, weil ich nur herausfinden muss, wie die Schleife funktioniert und wie ich dann einen anderen Prozess innerhalb der Schleife installieren kann, haha. Vielen Dank für Ihre Hilfe!

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: Ich habe einige Fortschritte gemacht, aber ich erhalte Nullwerte für die Spalten „Heilung“ und „Kosten“. Behandlungswerte werden durch das Programm „sea_dew_potion“ generiert. Jetzt habe ich 18 Einzelergebnisse, bei denen alle Werte korrekt sind, und ein Ergebnis, das eine Kombination aller Ergebnisse ist, aber mit leeren Werten für Behandlung und Kosten. Der Screenshot unten zeigt das Problem zwischen den Ergebnissätzen.

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 ;

Teil 2 bearbeiten Grüße @blabla_bingo, ich habe es endlich herausgefunden! Das ist die ultimative Abfrage für alle Interessierten, 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 ;

Alle Ergebnisse ohne Heilung oder Kosten

Persönliche Ergebnisse vs. Behandlung und Kosten

Das endgültige richtige Abfrageergebnis

P粉897881626P粉897881626283 Tage vor371

Antworte allen(1)Ich werde antworten

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

    Antwort
    0
  • StornierenAntwort