为第一个表中的每一行加入多个表并求和结果

时间:2014-11-12 10:53:06

标签: php sql join

我在为商店统计信息创建高效的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个类别时挂起数据库。

我不知道如何针对那么多数据进行优化查询。我希望你可以帮助我,因为我对加入并不是很好。

亲切的问候 标记

2 个答案:

答案 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