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