Я запустил следующее, и оно сработало.
$stmt = $pdo->query("
CREATE TEMPORARY TABLE IF NOT EXISTS info AS (
SELECT warehouse.merchandise_id, SUM(warehouse.prod_quantity) AS qty
FROM warehouse
WHERE warehouse.merchandise_id IN (SELECT merchandise.id FROM merchandise)
GROUP BY warehouse.merchandise_id
);
SELECT LPAD(`id`,8,'0'), prod_title, prod_lcode, prod_price, qty
FROM `merchandise` INNER JOIN info
ON merchandise.id = info.merchandise_id;
");
// skip to next rowset, because it's a fatal error to fetch from a statement that has no result
$stmt->nextRowset();
do {
$rowset = $stmt->fetchAll(PDO::FETCH_NUM);
if ($rowset) {
print_r($rowset);
}
} while ($stmt->nextRowset());
Обратите внимание, что мне пришлось исправить merchandise_count.merchandise_id
в info.merchandise_id
в вашем запросе, потому что у вас нет ссылки на таблицу merchandise_count
.
Однако я бы порекомендовал вам не беспокоиться о мультизапросах. Нет смысла объединять несколько операторов SQL в одном вызове. Также не поддерживается использование подготовленных операторов при использовании нескольких запросов или определение хранимых подпрограмм, таких как процедуры, функции или триггеры.
Вместо этого выполняйте операторы по одному. Используйте exec()
, если у оператора нет набора результатов и не нужно готовить операторы.
$pdo->exec("
CREATE TEMPORARY TABLE IF NOT EXISTS info AS (
SELECT warehouse.merchandise_id, SUM(warehouse.prod_quantity) AS qty
FROM warehouse
WHERE warehouse.merchandise_id IN (SELECT merchandise.id FROM merchandise)
GROUP BY warehouse.merchandise_id
)");
$stmt = $pdo->query("
SELECT LPAD(`id`,8,'0'), prod_title, prod_lcode, prod_price, qty
FROM `merchandise` INNER JOIN info
ON merchandise.id = info.merchandise_id
");
$rowset = $stmt->fetchAll(PDO::FETCH_NUM);
if ($rowset) {
print_r($rowset);
}
Пока вы используете то же соединение $pdo
, вы можете ссылаться на временные таблицы в последующих запросах .