【发布时间】:2018-04-30 20:22:43
【问题描述】:
我有一个遍历所有订单历史记录的脚本。打印结果需要几分钟时间,但我注意到我执行了几个足够相似的 SQL 语句,我想知道您是否可以对现有 SQL 结果执行另一个查询。
例如:
-- first SQL request
SELECT * FROM orders
WHERE status = 'shipped'
然后,在 foreach 循环中,我想从这个结果中查找信息。我天真的方法是执行这三个查询。请注意与上述查询的相似之处。
-- grabs customer's LTD sales
SELECT SUM(total) FROM orders
WHERE user = :user
AND status = 'shipped'
-- grabs number of orders customer has made
SELECT COUNT(*) FROM orders
WHERE user = :user
AND status = 'shipped'
AND total != 0
-- grabs number of giveaways user has won
SELECT COUNT(*) FROM orders
WHERE user = :user
AND status = 'shipped'
AND total = 0
当我寻找的结果是第一个查询的子集时,我最终会多次查询同一个表。我想在不执行更多 SQL 调用的情况下从第一个查询中获取信息。一些伪代码:
$stmt1 = $db->prepare("
SELECT * FROM orders
WHERE status = 'shipped'
");
$stmt1->execute();
foreach($stmt1 as $var) {
$username = $var['username'];
$stmt2 = $stmt1->workOn("
SELECT SUM(total) FROM this
WHERE user = :user
");
$stmt2->execute(array(
':user' => $username
));
$lifesales = $stmt2->fetchColumn();
$stmt3 = $stmt1->workOn("
SELECT COUNT(*) FROM this
WHERE user = :user
AND total != 0
");
$stmt3->execute(array(
':user' => $username
));
$totalorders = $stmt3->fetchColumn();
$stmt4 = $stmt1->workOn("
SELECT COUNT(*) FROM this
WHERE user = :user
AND total = 0
");
$stmt4->execute(array(
':user' => $username
));
$totalgaws = $stmt4->fetchColumn();
echo "Username: ".$username;
echo "<br/>Lifetime Sales: ".$lifesales;
echo "<br/>Total Orders: ".$totalorders;
echo "<br/>Total Giveaways: ".$totalgaws;
echo "<br/><br/>";
}
这样的事情可能吗?它更快吗?我现有的方法既慢又丑,我想要一种更快的方法。
【问题讨论】:
-
您可以将查询结果存储在临时表中,然后对该表执行其他查询以执行进一步过滤。