【问题标题】:Join multiple tables and sum results for each row in first table连接多个表并对第一个表中的每一行的结果求和
【发布时间】:2014-11-12 10:53:06
【问题描述】:

我在为商店统计信息创建高效的 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 中)并为 products_categories 和 orders_products 使用 join

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 个类别时挂起 db。

我不知道如何优化对这么多数据的查询。我希望你能帮助我,因为我不太擅长加入。

亲切的问候 标记

【问题讨论】:

    标签: php sql join


    【解决方案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 将“空”类别添加到结果中:

    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
    

    【讨论】:

    • 完美运行!谢谢你!
    • @MarekKaliszuk 很高兴我能帮助你。我还为您进一步改进了解决方案。
    • 更新良好的版本在小提琴上运行良好,但在实时服务器上挂起。查询看起来不错,但服务器无法处理。
    • @MarekKaliszuk 您可能会尝试删除 IFNULL 函数 - 也许 MySQL 无法解决它。是否有任何其他错误被触发,或者只是缓慢?
    • 其实是没有错误的。当我通过 phpMyAdmin 触发它时,我看不到任何结果。我在后台看到很多查询,并且及时服务器停止。然后我需要重启服务器。
    【解决方案2】:

    我不确定,但你可以试试这个,

    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
    

    【讨论】:

      猜你喜欢
      • 2018-05-17
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多