MySQL: Menggabungkan semua hasil dalam gelung (mungkin menggunakan UNION?)
P粉897881626
P粉897881626 2024-02-17 15:31:33
0
1
402

EDIT: Sudah diselesaikan dan dijawab: Tetapi jika anda mempunyai soalan yang sama, sila baca dan lihat bagaimana proses itu berfungsi

Latar belakang Saya mencipta prosedur yang dipanggil "sea_dew_potion" dan meletakkannya di dalam gelung yang dipanggil "loopseadew". Gelung berfungsi seperti yang diharapkan.

Soalan Gelung saya menghasilkan 18 hasil, tetapi saya mahu ia berada dalam set hasil tunggal supaya saya boleh mengeksportnya ke tableau untuk membuat carta garis dengan berbilang titik data, sekali gus membentuk beberapa bentuk lengkung. Selepas beberapa penyelidikan, saya fikir UNION boleh berfungsi, tetapi saya tidak pasti bagaimana untuk melakukannya, terutamanya kerana saya hanya memikirkan cara gelung berfungsi dan kemudian cara memasang proses lain di dalam gelung haha. terima kasih atas bantuan anda!

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: Saya telah membuat sedikit kemajuan, tetapi saya mendapat nilai batal untuk lajur "sembuh" dan "kos". Nilai rawatan dijana oleh program "sea_dew_potion". Sekarang saya mempunyai 18 keputusan individu di mana semua nilai adalah betul, dan satu keputusan yang merupakan gabungan semua keputusan tetapi dengan nilai kosong untuk rawatan dan kos. Tangkapan skrin di bahagian bawah menunjukkan isu antara set hasil.

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 ;

Edit Bahagian 2 Jerit kepada @blabla_bingo, akhirnya saya faham! Ini adalah pertanyaan muktamad untuk sesiapa yang berminat 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 ;

Semua hasil tanpa penawar atau kos

Hasil Peribadi lwn Rawatan dan Kos

Hasil pertanyaan akhir yang betul

P粉897881626
P粉897881626

membalas semua(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)

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan