Mysql group by 具有不同的和内部连接

Posted

技术标签:

【中文标题】Mysql group by 具有不同的和内部连接【英文标题】:Mysql group by with distinct and inner join 【发布时间】:2021-02-14 23:52:48 【问题描述】:

两个实体:

    发货
ShipmentId (PK) ShipmentTypeId 状态标识 EstArrivalDate
    ShipmentItem
ShipmentId ShipmentItemSeqId 产品编号 数量

我已经创建了一个带有 shippingId 的连接(内部连接),并希望对于每个不同的 productId,mysql 应该只返回一行。

我想查找不同的产品,并且只查找每种产品的第一条记录

SELECT DISTINCT(SI.PRODUCT_ID), S.ESTIMATED_ARRIVAL_DATE, SI.QUANTITY AS SUM_QTY
FROM SHIPMENT S INNER JOIN
     SHIPMENT_ITEM SI
     ON S.SHIPMENT_ID = SI.SHIPMENT_ID AND 
        S.SHIPMENT_TYPE_ID = 'PURCHASE_SHIPMENT' AND 
        S.STATUS_ID = 'PURCH_SHIP_CREATED' AND 
        S.ESTIMATED_ARRIVAL_DATE > NOW()
GROUP BY SI.PRODUCT_ID, S.ESTIMATED_ARRIVAL_DATE, SI.QUANTITY
HAVING SI.QUANTITY > 0;

请帮帮我,因为这不起作用。

【问题讨论】:

请提供样本数据和期望的结果。我不完全理解您所说的“仅每种产品的第一条记录”是什么意思。 【参考方案1】:

如果你运行的是 MySQL 8.0,你可以用窗口函数解决这个问题:

select *
from (
    select si.product_id, s.estimated_arrival_date, si.quantity as sum_qty,
        row_number() over(partition by si.product_id order by s.estimated_arrival_date) rn
    from shipment s 
    inner join shipment_item si on s.shipment_id = si.shipment_id 
    where 
        s.shipment_type_id = 'purchase_shipment' 
        and s.status_id = 'purch_ship_created' 
        and s.estimated_arrival_date > now()
) t
where rn = 1

【讨论】:

以上是关于Mysql group by 具有不同的和内部连接的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL group by 和内部连接

MySQL GROUP BY ...具有不同的值相同的字段

MySQL 查询优化与 group by 和 order by rand

如何通过内部连接使用 group by

MySQL:Group By的具体介绍与内部执行原理

mysql连接3个表与group by group by