mysqli_multi_qry дождитесь вывода запроса, прежде чем вызывать его снова

#php #mysql #mysqli

#php #mysql #mysqli

Вопрос:

Ниже у меня есть код, который создает множественный 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() amp;amp; $con->next_result()) ;
}
 

Этот код создает запрос на основе заданных branch_id и item_id. Этот код работает, но если item_id достигает 1 тыс. данных (эквивалент для 1 тыс. хранимых процедур), возникает ошибка. Я получаю много сна в своей базе данных, а также ошибку тайм-аута.

введите описание изображения здесь

введите описание изображения здесь

Как я могу исправить эту ошибку? Вызывайте запрос по одному за раз или дождитесь вывода 1-го. Есть предложения?

Вот мой 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
 

Комментарии:

1. Честно говоря, я бы избавился от множественного запроса, избавился от хранимой процедуры, вместо этого сделал бы один запрос, который принимает несколько параметров. Или, по крайней мере, избавьтесь от множественного запроса, поскольку это не имеет никакого смысла.

2. Не видя, что делает ваш SP, трудно сказать, что вам следует делать или в чем может быть проблема, но честный совет: удалите multi_query и хранимую процедуру. Обе функции очень старые, и их очень сложно получить правильно. Вызов SP из PHP действительно неприятен и вызовет у вас больше проблем, чем того стоит. Вы можете добиться гораздо более чистого и простого решения с помощью подготовленных инструкций.

3. @dharman мой sp — это только поиск количества на основе заданных branch_id и item_id

4. сейчас я не на своем компьютере, поэтому не могу его отредактировать. Я думаю, что вместо множественного запроса я сделаю объединение all. Помогает ли такой подход? Особенно я собираюсь объединить 3k select

5. @Dharman Я добавил SP thnx