我有两张桌子。表A
和表B
。两者都以many-to-many关系连接。
表A:
ID
---
1
2
表B:
ID
---
3
4
表AB:
ID | A_ID | B_ID
----------------
5 | 1 | 4
6 | 1 | 3
7 | 2 | 3
我想从表格ID
获取B
的列表,该列表与表ID
的{{1}}列表有关。
上表中的示例:
我希望获得与表A
B
1和A
有关系的所有ID
2。然后,我得到ID
3必须表ID
的{{1}}个。{/ p>
如何使用SQL查询执行此操作?
答案 0 :(得分:2)
如果您希望根据As(不是ALL As)列表进行选择,那么请执行以下操作:
SELECT b_id
FROM ab
WHERE a_id IN (1,2)
GROUP BY b_id
HAVING COUNT(a_id) = 2
将(1,2)
替换为您的列表,并将having子句中的2
替换为列表项的数量。
如果从子查询中获取As列表,则可以这样做(不是在MySQL中,但是......):
WITH subquery (
--subquery code here
)
SELECT b_id
FROM ab
WHERE a_id IN subquery
GROUP BY b_id
HAVING COUNT(a_id) = (SELECT COUNT(*) FROM subquery)
在MySQL中,您必须将子查询代码放两次并删除WITH子句。
您还可以使用临时表,然后从该临时表中选择ALL As,因此Gordon Linoffs回答......
答案 1 :(得分:0)
您可以通过加入和统计来完成此操作:
SELECT B_ID
FROM AB JOIN A
ON
AB.A_ID = A.ID
GROUP BY AB.B_ID
HAVING COUNT(DISTINCT AB.A_ID) = (SELECT COUNT(distinct ID) FROM A);
如果您知道AB
或A
中没有重复项,则可以从distinct
中删除count()
。