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

时间:2012-04-26 15:56:15

标签: mysql join

我一直在努力解决这个MySQL问题...问题的一半是措辞我的问题,我道歉如果之前已经解决了,我做了很多搜索,但无法找到解决方案。

我有两个表,称为orders和order_items 每个订单都可以包含许多订单商品。

我需要进行一次搜索,返回只包含一个订单商品而不是另一个订单商品的订单,反之亦然。

为了说明这一点:

表格订单

order_id
1
2
3

表order_items

order_item_id | order_item_type | order_id
1             | A               | 1
2             | A               | 2
3             | B               | 2
4             | B               | 3

我需要做的是获得仅包含项目A,仅包含项目B和两者的订单。

正如您所见,只有项目A应该返回订单1,只有项目B应该返回订单3,并且两者都应该返回订单2.

尽管我尝试过最好的尝试,但我无法正常工作。以下是仅使用商品A

返回订单的当前尝试
    SELECT *
    FROM orders
    LEFT OUTER JOIN order_items
    ON order_items.order_id = orders.order_id
    WHERE order_items.order_item_type IN ('A')
    AND order_items.order_item_type NOT IN ('B')
    GROUP BY orders.order_id

作为一个有经验的人可能会猜测看我的尝试,这会返回第1阶和第2阶段。我认为这可能是通过子查询来完成的,但我相信它可以通过适当的连接来完成...不知道怎么做。谢谢!

1 个答案:

答案 0 :(得分:0)

选择单个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

选择了两个ord​​er_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表。