Выполнение двух SQL запросов в PHP, где первый оператор создает временную таблицу для использования вторым - PullRequest
2 голосов
/ 19 апреля 2020

Я хочу выполнить этот длинный SQL запрос в PHP.

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 = merchandise_count.merchandise_id;

Вот краткое объяснение того, что он делает: сначала он создает временную таблицу для хранения некоторых выбранных данных, затем он использует временную таблицу, чтобы INNER СОЕДИНЯЕТ ее с данными в постоянной таблице.

Я уже пробовал '$ Statement1; $ Statement2;' в PHP, но он дает синтаксис и ошибку нарушения доступа, но данный запрос работает без сбоев в phpmyadmin.

Я проверил другие подобные сообщения, такие как this , и они предлагают использовать '$ Statement1; $ оператор2;» но это не работает для меня. Мой сервер работает PHP 7. Я использую PHP PDO для подключения к моей базе данных. Любая помощь приветствуется.

1 Ответ

2 голосов
/ 19 апреля 2020

Я запустил следующее, и оно сработало.

$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, вы можете ссылаться на временные таблицы в последующих запросах .

...