我尝试清理一个目前获得所有产品的非常糟糕编码的网站,然后在每个产品上运行查询,如果计数大于0则从第二个表获取库存计数然后如果有结果回显了产品页面。
因此,在清理其他混乱的时候,我做了一个查询(有3个单独的查询,它们都做了同样的事情只是不同的变量)并且停止需要在页面上运行300多个mysql查询我添加了他剩下的总和加入表库存列,以便我可以访问它以检查它是否超过0。
然而,这似乎比运行数百个单独的查询慢了3倍。
服务器不是很好,因此在MySQL负载下因MySQL问题而死亡。但是,虽然我认为运行较少的查询会导致执行时间更长的问题。
有没有办法让其他表加入列的总和不会让我失望?
查询
以下是长查询的示例:
SELECT p.Product_Name,
p.Product_Price,
sum( i.Current_Stock ) AS Current_Stock
FROM Products p LEFT JOIN
Items i ON p.Product_Name = i.Product_Name
GROUP BY p.Product_ID
ORDER BY p.Product_ID DESC
简短查询是:
SELECT *
FROM Products
ORDER BY Product_ID DESC
每个查找Items表库存的产品进行第二次查询:
SELECT *
FROM Items
WHERE Product_Name = 'Shirt'
AND Current_Stock > 0
然后我会检查查询是否有效或mysql_numrows
是否返回0,并根据该产品的任何选项是否有库存来跳过或回显产品。
产品表
Product_ID | Product_Name
-------------------------
1 | Shirt
2 | Trousers
3 | Dress
项目表
Item_ID | Product_Name | Option | Current_Stock
-----------------------------------------
1 | Shirt | Small | 0
2 | Shirt | Medium | 2
3 | Shirt | Large | 1
答案 0 :(得分:0)
您的第一个查询从两个表中收集行,以创建所有组合内容的临时表。然后你的GROUP BY
缩小了它。为了避免这种膨胀 - 放气:
SELECT p.Product_Name, p.Product_Price,
( SELECT sum( i.Current_Stock )
FROM Items i
WHERE p.Product_Name = i.Product_Name
) AS Current_Stock
FROM Products p
ORDER BY p.Product_ID DESC