问题
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