我使用PHP编写脚本并使用MsSQL数据库。
我的脚本循环通过产品ID列表。对于每个id,它创建一个产品数据对象。对于产品对象中的“邮资”字段,我调用一个执行另一个查询的邮资类。
$products = $productsObj->getProducts($i, $limit);
foreach($products as $product)
{
echo $product['productName'] . '|';
echo $product['productDescription'] . '|';
echo $product['productPrice'] . '|';
$postage = $postageObj->getPostageCostforProduct(1, $product['weight'], $product['productPrice']);
echo $postage . '|';
}
有人告诉我,如果有很多产品,我可以利用'表变量'来加快这个过程。但是,我正在努力了解这有何帮助以及如何实现这一点。我会使用表变量查询替换邮资类中现有的邮资查询吗?如果是这样,究竟如何工作并帮助服务器加载?
修改
获取产品ID列表的查询是:
SELECT * FROM FROM products WHERE category='$this->cat'
然后我循环遍历每个产品并为每个产品创建和对象。获取对象的产品数据的查询是:
SELECT p.id as prod_id, * FROM products AS p WITH(NOLOCK)
WHERE (p.id = '$this->prod_id')
显示数据时,我调用以下查询来获取邮资:
SELECT Postage.postageName, Postage.Description AS postagedesc, Postage.id, Postage.qtyPer, Postage.pricePer, Postage.groupID, Groups.country_filter FROM Postage
LEFT OUTER JOIN Groups ON Postage.groupID = Groups.id
WHERE (Postage.minimumQty <= '$qty') AND (PostageRules.maximumQty >= '$qty')
(Postage.minPrice <= '$price') AND (Postage.maxPrice >= '$price')
答案 0 :(得分:1)
您可以使用外部联接Postage
在单个查询中检索产品及其邮资费用值:
SELECT
pr.productName,
pr.productDescription,
pr.productPrice,
pr.productWeight,
po.postageName,
po.Description AS postagedesc,
po.id,
po.qtyPer,
po.pricePer,
po.groupID,
gr.country_filter
FROM products AS pr
LEFT JOIN Postage AS po
ON po.minimumQty <= pr.productWeight
AND po.maximumQty >= pr.productWeight
AND po.minPrice <= pr.productPrice
AND po.maxPrice >= pr.productPrice
LEFT JOIN Groups AS gr
ON po.groupID = gr.id
WHERE pr.category = '$this->cat'
我想,这个查询可以在productsObj
中以不同的名称定义(例如,作为getProductsWithPostageCosts
)并使用,或许如下:
$products = $productsObj->getProductsWithPostageCosts($i, $limit);
foreach($products as $product)
{
echo $product['productName'] . '|';
echo $product['productDescription'] . '|';
echo $product['productPrice'] . '|';
echo $product['postageName'] . '|';
echo $product['postagedesc'] . '|';
...
echo $product['country_filter'] . '|';
}