簡體   English   中英

在 PHP 中運行兩個 SQL 查詢,其中第一條語句創建一個臨時表供第二條語句使用

[英]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;

下面是它所做的快速解釋:首先它創建一個臨時表來存儲一些選定的數據,然后它使用臨時表將它與永久表中的數據進行 INNER JOIN。

我已經嘗試過'$statement1;$statement2;' 在 PHP 中,但它給出了語法和訪問沖突錯誤,但給定的查詢在 phpmyadmin 中完美運行。

我檢查了其他類似帖子,他們建議使用'$statement1;$statement2;' 但這對我不起作用。 我的服務器正在運行 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修復為 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連接,就可以在后續查詢中引用臨時表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM