我在为商店统计信息创建高效的sql查询时遇到问题。我有三个表:categories,product_categories和orders_products。
表类别 - 包含类别和结构的列表(简短版本):
id
name
表 product_categories - 包含产品和类别之间的关联。结构简短版:
id
product_id
category_id
表 orders_products - 包含商店中销售的所有商品。结构如下:
id
product_id
price
quantity
我想要做的是显示当前类别的类别名称和已售商品价值的表格。
当我有超过2000个类别,每个类别超过20个项目以及许多已售出商品时,会出现问题。
我试过了:
1)通过一个简单的查询获取所有类别
2)Foreach他们(在php中)并使用join for products_catogories和orders_products
SELECT orders_products.id,orders_products.product_price_gross,orders_products.product_qty,orders_products.option_price,orders_products.rebate
FROM product_categories
LEFT JOIN orders_products
ON product_categories.product_id = orders_products.product_id
3)Foreach导致php和sum值
4)显示结果
5)效果 - 在foreach中超过50个类别时挂起数据库。
我不知道如何针对那么多数据进行优化查询。我希望你可以帮助我,因为我对加入并不是很好。
亲切的问候 标记
答案 0 :(得分:1)
您可以一步完成所有这些工作,让MySQL为您执行这些计算:
SELECT categories.name,
SUM(order_products.price * order_products.quantity)
FROM order_products
LEFT JOIN product_categories ON product_categories.product_id = order_products.product_id
LEFT JOIN categories ON product_categories.category_id = categories.id
GROUP BY categories.name,
categories.id
这将仅返回类别的总和,其中至少包含一次购买。 请参阅此example sqlfiddle。
我进一步开发了SQL查询(new fiddle)以包含每个类别的数量并添加"空"通过转动JoOIN来没有向reult销售的类别:
SELECT categories.name,
Ifnull(Sum(order_products.quantity), 0) AS quantity,
Ifnull(Sum(order_products.price * order_products.quantity), 0) AS `Total Sales`
FROM categories
LEFT JOIN product_categories ON product_categories.category_id = categories.id
LEFT JOIN order_products ON product_categories.product_id = order_products.product_id
GROUP BY categories.name,
categories.id
答案 1 :(得分:0)
我不确定,但你可以试试这个,
SELECT orders_products.id,sum(orders_products.product_price_gross),sum(orders_products.product_qty),sum(orders_products.option_price),sum(orders_products.rebate)
FROM product_categories
LEFT JOIN orders_products
ON product_categories.product_id = orders_products.product_id group by product_categories.category_id