MySQL正确的连接方法,用于一对多关系,包括和排除右表



我一直在尝试解决这个MySQL问题...问题的一半是措辞我的问题,如果之前已经解决了,我深表歉意,我做了很多搜索,但找不到解决方案。

我有两个表,称为订单和order_items每个订单可以包含多个订单项。

我需要进行搜索,返回仅包含一个订单项目而不是另一个订单项目的订单,反之亦然。

为了说明这一点:

表顺序

order_id123

表 order_items

order_item_id |order_item_type |order_id1 |一 |12 |一 |23 |乙 |24 |乙 |3

我需要做的是获取仅包含项目 A、仅包含项目 B 以及两者的订单。

如您所见,只有物料 A 应返回订单 1,只有物料 B 应返回订单 3,并且两者都应返回订单 2。

尽管我尽了最大的努力,但我无法获得任何工作。这是当前尝试仅退回项目 A 的订单

   选择*    从订单    左外连接order_items    ON order_items.order_id = orders.order_id    其中 order_items.order_item_type IN ('A')    和 order_items.ORDER_ITEM_TYPE 不在 ('B') 中    按orders.order_id分组

作为一个有经验的人可能会猜到我的尝试,这同时返回订单 1 和订单 2。我认为这可以通过子查询来完成,但我相信可以通过适当的连接来完成......只是不知道该怎么做。谢谢!

当选择单个order_item时:

SELECT i.* FROM order_items i
WHERE i.order_item_type = 'A' AND
  (SELECT COUNT(order_id) FROM order_items WHERE order_id = i.order_id) = 1

选择了两个order_item:

SELECT i.* FROM order_items i
WHERE i.order_item_type IN ('A', 'B') AND
  (SELECT COUNT(order_id) FROM order_items WHERE order_id = i.order_id) = 2

并根据需要加入orders表。

最新更新