运行 PHP 中的两个 SQL 查询,其中第一个语句创建一个临时 table 以供第二个语句使用

Running two SQL queries in PHP where the first statement creates a temporary table to be used by the second one

我想在 PHP 中 运行 这个长的 SQL 查询。

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;

这里简单解释一下它的作用:首先它创建一个临时 table 来存储一些选定的数据,然后它使用临时 table 将它与永久 table 中的数据进行内部连接 ​​table.

我已经尝试过“$statement1;$statement2;”在 PHP 中,但它给出语法和访问冲突错误,但给定的查询在 phpmyadmin 中完美运行。

我查看了其他类似的帖子,例如 this,他们建议使用“$statement1;$statement2;”但它对我不起作用。我的服务器是 运行ning PHP 7。我正在使用 PHP PDO 连接到我的数据库。感谢任何帮助。

我 运行 以下内容确实有效。

$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,因为您没有 table 对 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连接,就可以在后续查询中引用临时的table。