如何将多行的结果聚合成一行 mysql

How to aggregate results from many rows into a single row mysql

我有一个订单 table,其中 OrderId 作为主键。我还有一个 Order_Products table,OrderId 为 FK。每个 Order_Product 行都有 Product_Name、Product_Status、Product_Delivery_Date 等列。table 以一对多关系连接到 OrderId。

我正在尝试设计一个将合并两个 table 的查询,这样我就可以为每个 OrderId 获取一行,但是该查询必须有一个包含 Oder_Name 的描述列连接所有 Order_Product 行的值;我还需要使用一些逻辑来计算聚合 Product_Status(如果其中一个产品是 'NotCompleted',那么聚合 Product_Status 将是 'NotCompleted'。最后我想计算 OrderDeliveryDate,使其成为所有 Order_Product Product_Delivery_Date 值的最小值。

我正在使用 MySql。你能给我一些关于如何完成这三个任务的建议吗?

示例:

订单表:

OrderId 客户名称

1001 个客户 X

OrderProducts 表:

Id OrderId ProductDescription ProductDeliveryDate ProductStatus
20 1001 产品 A 2015-01-30 未完成
21 1001 产品 B 2015-01-15 完成
24 1001 ProductC 2015-02-13 未完成

所需的查询输出:

OrderId CustomerName 描述 OrderDeliveryDate OrderStatus
'1001' 'CustomerX' 'ProductA,ProductB,ProductC' '2015-01-15' 'NotCompleted'

根据您的描述,如下查询可能会满足您的要求:

select o.*, op.status, op.orderdeliverydate, op.description
from orders o join
     (select OrderId, group_concat(op.order_name) as description,
             (case when sum(Product_Status = 'Not Completed') > 0 then 'Not Completed'
                   else 'Completed'
              end) as Status,
             min(Product_Delivery_date) as OrderDeliveryDate
      from Order_Product
      group by OrderId
     ) op
     on o.OrderId = p.OrderId;