【问题标题】:Breaking bundled products in MySQL打破 MySQL 中的捆绑产品
【发布时间】:2020-05-19 08:52:22
【问题描述】:

我有一个简单的查询来计算过去 3 天内售出的平均产品数量。现在我必须扩展查询,以便它解耦捆绑的产品。

数据库结构(简化):

订购

  • 身份证
  • date_order_created_at

order_product

  • product_sku
  • 数量
  • order_id

product_bundle

  • product_sku - “子”product_sku
  • bundle_sku - “父/捆绑”product_sku
  • 数量 - 表示捆绑中包含的产品数量

产品

  • product_sku
  • 姓名

示例数据

例如,order_product 可能包含捆绑商品“护手霜 + 身体霜”,它必须显示为 2 件商品,这应该可以使用 product_bundle 表格来实现。

在需要显示捆绑销售的产品数量之前,我可以使用以下查询来显示过去 3 天的平均销售数量:

SELECT p.name 
     , SUM(op.quantity)/3 avg_3_days
  FROM order_product op
  LEFT 
  JOIN `order` o 
    ON o.id = op.order_id 
  LEFT 
  JOIN product p
    ON p.sku = op.product_sku 
 WHERE o.date_order_created_at BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -3 DAY)) AND DATE(DATE_ADD(NOW(), INTERVAL -1 DAY)))
 GROUP 
    BY p.name
 ORDER 
    BY avg_3_days DESC

现在我想使用来自product_bundle 的数据将捆绑包分开,并将它们显示为单个产品,包括所有非捆绑包产品。产品包可能包含 2 个或更多项目。

我已经尝试过各种 UNION 和子查询语句,但我无法理解它。 这甚至可以使用当前的数据库结构来实现吗?

【问题讨论】:

  • 更新您的问题添加适当的数据样本和预期结果
  • 我更喜欢避免使用保留字作为表/列标识符;眼睛会舒服一点!
  • 正确,特别是“订单”。感谢您的编辑。

标签: mysql


【解决方案1】:

在多次尝试失败后,我成功使用了 UNION 和 LEFT JOIN 语句的组合。

SELECT 
    op.product_sku,
    SUM(op.quantity) / 3 AS `avgLast3days`
FROM
    order_product op
        LEFT JOIN
    `order` o ON o.id = op.order_id
WHERE
    o.date_order_created_at > '2020-05-17'
        AND op.product_sku NOT IN (SELECT 
            bundle_sku
        FROM
            product_bundle)
GROUP BY op.product_sku 
UNION ALL SELECT 
    pb.product_sku,
    SUM(pb.quantity * op.quantity) / 3 AS `avgLast3days`
FROM
    product_bundle pb
        LEFT JOIN
    order_product op ON op.product_sku = pb.bundle_sku
        LEFT JOIN
    `order` o  ON o.id = op.order_id
WHERE
    o.date_order_created_at > '2020-05-17'
GROUP BY pb.product_sku
ORDER BY avgLast3days DESC

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    相关资源
    最近更新 更多