MySQL连接表,其中所有左侧记录都在右侧

时间:2016-11-30 21:03:37

标签: mysql

我需要从表A中获取同样在表B中的匹配记录。但我无法弄清楚我是否可以在一个查询中执行此操作。

表A

id | order_id | title
----------------------------------
 1 | 1114     | Product 1
 2 | 1115     | Product 1
 3 | 1115     | Product 2
 4 | 1116     | Product 1
 5 | 1117     | Product 3
 6 | 1118     | Product 4
 7 | 1118     | Product 5

表B

id | order_id | a_id | title
----------------------------------
 1 | 2221     |    1 | Product 1
 2 | 2222     |    2 | Product 1
 3 | 2222     |    3 | Product 2
 4 | 2223     |    7 | Product 5

现在我需要表A中的所有order_id值,其中所有产品也在表B中。因此,这将导致:

1114
1115

1116失败,因为没有b.a_id4
1117失败,因为没有b.a_id5
1118失败,因为67都不在b.a_id

我尝试了INNER JOIN,但这也会返回1118。我还尝试LEFT JOINWHERE b.a_id IS NULL,但恰恰相反。所以我尝试了RIGHT JOIN,但这也会返回1118

请参阅此SQL Fiddle

我希望我明确了我的目标是什么,如果可以通过一个查询管理,我很好奇。

2 个答案:

答案 0 :(得分:1)

它并不完美,但它确实通过SQL Fiddle返回现有数据的正确结果。也许你可以用它作为起点?

SELECT a.order_id, count(distinct a.id) as aCount, count(distinct b.a_id) as bCount
FROM a
LEFT JOIN b ON a.id = b.a_id
GROUP BY a.order_id
HAVING aCount = bCount;

答案 1 :(得分:1)

在单个查询中可以使用:

SELECT a.order_id, COUNT(a.id) as cntA, COUNT(b.id) AS cntB
FROM a
  LEFT JOIN b ON a.id = b.a_id
GROUP BY a.order_id
HAVING cntA = cntB;