mysqli_multi_qry wait for the output of the query before calling it again

橙三吉。 提交于 2020-12-15 03:43:23

问题


I have a code below that creates a multi qry

$sql_multi = "";
for ($branch_index = 0; $branch_index < count($branch_ids); $branch_index++) {
    for ($item_index = 0; $item_index < count($item_ids); $item_index++) {
        $item_id   = $item_ids[$item_index];
        $branch_id = $branch_ids[$branch_index];
        $sql_multi .= "CALL sp_pivot_qty_eb(".$item_id.",".$branch_id.",'".$_GET["to"]."');";
    }
}

/* execute multi query for qty */
if ($con->multi_query($sql_multi)) {
    do {
        $result = $con->store_result();
        
        while ($rows = $result->fetch_assoc()) {
            foreach ($rows as $value) {
                echo $value . "<br>";
            }
        }
        
        $con->next_result();
    } while ($con->more_results() && $con->next_result()) ;
}

This code creates a query based on given branch_id and item_id. This code works but if the item_id reach 1 thousand data (equivalent on 1k stored procedure) this is the error occurs. I get a lot of sleep in my database and also timeout error.

How can I fix this error? Call the query one at the time or wait for the output 1st. Any suggestion?

Here is my SP

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_pivot_qty_eb`(
    param_item_id INT,
    param_branch_id INT,
    param_date VARCHAR(255)
)
BEGIN
    SELECT
        CONCAT(
            param_branch_id,
            "~",
            param_item_id,
            "~",
            REPLACE(IFNULL(SUM(b.qty),0),'.00','')
        ) AS data_output
    FROM    
            dim_item_masterfile a
    LEFT JOIN (
            SELECT 
                    a.item_id,
                    SUM(a.qty) AS qty 
            FROM
                            fct_inventory a
            LEFT JOIN (
                    SELECT
                            a.appkey,
                            a.sales_date 
                    FROM
                            fct_sales_payment a
                    INNER JOIN
                            fct_sales_item b
                    ON
                            a.appkey = b.appkey AND b.item_id = param_item_id
                    WHERE
                            a.is_void = 0 
                    AND 
                            a.is_cancel = 0 
                    AND 
                            a.branch_id = param_branch_id 
                    AND 
                            a.sales_date BETWEEN '2020-01-01' AND param_date
                            
                    UNION ALL

                    SELECT
                            a.appkey,
                            a.sales_date 
                    FROM
                            fct_sales_payment_cc a
                    INNER JOIN
                            fct_sales_item b
                    ON
                            a.appkey = b.appkey AND b.item_id = param_item_id
                    WHERE
                            a.is_void = 0 
                    AND 
                            a.is_cancel = 0 
                    AND 
                            a.branch_id = param_branch_id  
                    AND 
                            a.sales_date BETWEEN '2020-01-01' AND param_date
                            
                    UNION ALL

                    SELECT
                            a.appkey,
                            a.sales_date 
                    FROM
                            fct_sales_payment_gc a
                    INNER JOIN
                            fct_sales_item b
                    ON
                            a.appkey = b.appkey AND b.item_id = param_item_id
                    WHERE
                            a.is_void = 0 
                    AND 
                            a.is_cancel = 0 
                    AND 
                            a.branch_id = param_branch_id  
                    AND 
                            a.sales_date BETWEEN '2020-01-01' AND param_date
                            
                    UNION ALL

                    SELECT
                            a.appkey,
                            a.sales_date 
                    FROM
                            fct_sales_payment_hc a
                    INNER JOIN
                            fct_sales_item b
                    ON
                            a.appkey = b.appkey AND b.item_id = param_item_id
                    WHERE
                            a.is_void = 0 
                    AND 
                            a.is_cancel = 0 
                    AND 
                            a.branch_id = param_branch_id  
                    AND 
                            a.sales_date BETWEEN '2020-01-01' AND param_date
                            
                    UNION ALL

                    SELECT
                            a.appkey,
                            a.sales_date 
                    FROM
                            fct_sales_payment_flexi a
                    INNER JOIN
                            fct_sales_item b
                    ON
                            a.appkey = b.appkey AND b.item_id = param_item_id
                    WHERE
                            a.is_void = 0 
                    AND 
                            a.is_cancel = 0 
                    AND 
                            a.branch_id = param_branch_id  
                    AND 
                            a.sales_date BETWEEN '2020-01-01' AND param_date

                    UNION ALL

                    SELECT
                            a.appkey,
                            a.sales_date 
                    FROM
                            fct_cashin_st a
                    INNER JOIN
                            fct_cashin_item b
                    ON
                            a.appkey = b.appkey AND b.item_id = param_item_id
                    WHERE
                            a.is_void = 0 
                    AND 
                            a.is_cancel = 0 
                    AND 
                            a.branch_id = param_branch_id  
                    AND 
                            a.sales_date BETWEEN '2020-01-01' AND param_date
            ) b
            ON
                    a.appkey = b.appkey
            WHERE
                    IFNULL(b.sales_date,DATE(a.date_created)) BETWEEN '2020-01-01' AND param_date
            AND
                    a.branch_id = param_branch_id 
            GROUP BY
                    a.item_id
    ) b
    ON
            a.id = b.item_id
    WHERE
            a.id = param_item_id
    GROUP BY
             a.id
    ORDER BY
             a.id ASC;
END

来源:https://stackoverflow.com/questions/65105627/mysqli-multi-qry-wait-for-the-output-of-the-query-before-calling-it-again

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!