2

我想在 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;

下面是它所做的快速解释:首先它创建一个临时表来存储一些选定的数据,然后它使用临时表将它与永久表中的数据进行 INNER JOIN。

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

我检查了其他类似的帖子他们建议使用'$statement1;$statement2;' 但这对我不起作用。我的服务器正在运行 PHP 7。我正在使用 PHP PDO 连接到我的数据库。任何帮助表示赞赏。

4

1 回答 1

2

我运行了以下命令,它确实有效。

$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_idto 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连接,就可以在后续查询中引用临时表。

于 2020-04-19T17:57:32.750 回答