【问题标题】:Fetch only matching records from two entities仅从两个实体中获取匹配的记录
【发布时间】:2020-01-20 15:04:35
【问题描述】:

请帮助我进行 MYSQL 查询。

实体名称:OrderItem 属性:orderId(PK)、orderItemSeqId(PK)、productId

实体名称:ProductFacility 属性:facilityId(PK)、productId(PK)、inventoryCount (Integer)

**OrderId  | orderItemSeqId | productId**

  OID1     |       0001     |   10000 

  OID1     |       0002     |   10001 

  OID1     |       0003     |   10002


**FacilityId | ProductId | InventoryCount**

  FC_1     |   10000    |    12

  FC_1     |   10001    |    5

  FC_1     |   10002    |    7

  FC_2     |   10001    |    1

  FC_2     |   10002    |    6

  FC_3     |   10002    |    7

在这里,我想获取所有可供订购的产品的设施 (FC_1)。

我不想要包含部分产品的设施记录(如设施 FC_3 的订单 OID1 只有一个 (10002) 产品)

我只想要包含订单中所有产品的 facilityId 记录(前 OID1)

重要提示:此 SQL 将在数百万条记录上执行。

【问题讨论】:

  • 嗨@LalitDashora 这个问题的答案已经很少了。他们中的任何一个对你有帮助吗?如果没有,请发表评论...如果答案对您有帮助,您也可以投票...并且您可以接受正确的答案。如果您不知道如何执行此操作,请询问。你会很高兴感谢帮助你解决问题的人。干杯!

标签: mysql sql mysql-workbench


【解决方案1】:

试试这个:

select * 
from ProductFacility  f1
where (select count(distinct InventoryCount) cnt_fac
       from ProductFacility  f2
       where f2.FacilityId = f1.FacilityId
       and InventoryCount > 0
       group by FacilityId ) = (select count(distinct productId) 
                                from OrderItem );

这是DEMO

【讨论】:

  • 这仅适用于OrderT中只有一个订单:dbfiddle.uk/…
  • OrderItemdbfiddle.uk/…中有多个订单时仍然不起作用
  • 我给了你一个包含 2 个订单的演示 - 你可以在那里测试你的查询...
  • 我做了,它返回值。 dbfiddle.uk/… 谢谢!
  • @LalitDashora 所以这行得通吗?如果不是为什么?干杯!
【解决方案2】:

这将为您提供您正在寻找的设施

with cte as
(
 select OrderId, count(*)      as c
 from orderT a
 group by OrderId
)
select FacilityId, b.OrderId, count(*) as c from Facility a
inner join orderT b on a.ProductId  = b.ProductId
group by FacilityId, b.OrderId
having count(*) = (select c from cte c where c.OrderId = b.OrderId)

【讨论】:

    【解决方案3】:

    要获得可以满足订单的设施列表,您需要检查订单中每个产品的InventoryCount > 0,您可以使用以下查询:

    SELECT O.OrderId, F.FacilityID
    FROM (SELECT DISTINCT productId
          FROM OrderItem) P
    CROSS JOIN (SELECT DISTINCT OrderId
                FROM OrderItem) O
    CROSS JOIN (SELECT DISTINCT FacilityId
                FROM ProductFacility) F
    LEFT JOIN OrderItem OI ON OI.OrderId = O.OrderID AND OI.productId = P.productId
    LEFT JOIN ProductFacility PF ON PF.FacilityId = F.FacilityId AND PF.productId = OI.productId AND PF.InventoryCount > 0
    GROUP BY O.OrderId, F.FacilityID
    HAVING COUNT(OI.ProductId) = COUNT(PF.ProductId)
    

    我在演示中添加了一个额外的订单,需要产品1000110002;因为输出是

    OrderId     FacilityID
    OID1        FC_1
    OID2        FC_1
    OID2        FC_2
    

    Demo on SQLFiddle

    【讨论】:

    • 请注意:在 MySQL 8 和 MySQL 5.7 的这个小提琴上,这有错误:dbfiddle.uk/…
    【解决方案4】:

    这应该可行:

    select oc.orderId, ofc.facilityId
    from
    (
       select orderId, count(*) productCount
       from OrderItem
       group by orderId) oc 
    inner join
    (
       select pf.facilityId, oi.orderId, count(*) productsAvailableCount
       from ProductFacility pf
       inner join OrderItem oi on oi.productId = pf.productId and pf.inventoryCount > 0
       group by pf.facilityId, oi.orderId
    ) ofc on ofc.orderId = oc.orderId and oc.productCount = ofc.productsAvailableCount
    

    Demo on DB Fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      相关资源
      最近更新 更多