运行 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。
我想在 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。