[英]Speeding up mysql query with left join and sum
我尝试清理一个编码错误的站点,该站点当前获取所有产品,遍历下摆,然后对每个产品运行查询,以从第二张表中获取库存计数(如果计数大于0的话),如果结果回显页面上的产品。
因此,在清理其他混乱的同时,我进行了一个查询(有3个单独的查询,都执行相同的操作,只是变量不同),并且为了不再需要在页面上运行300个以上的mysql查询,我添加了一个总和,他离开了联接表库存列,这样我就可以访问它以检查它是否超过0。
但是,这似乎比运行数百个独立查询慢3倍。
该服务器不是很好,因此由于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
您的第一个查询从两个表中收集行,以构成所有组合物料的临时表。 然后,您的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.