#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