0

我在 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') 
4

1 回答 1

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(比如 as 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'] . '|';

}
于 2012-08-31T19:08:42.090 回答