如何编写SQL查询与全部指定Table2条目关联的Table1对象?
解决多对多关联中同时匹配多个条目的SQL查询
针对你的需求——获取Table1中同时关联Table2里item 2和item 3的所有对象,这里提供几种常用的SQL写法:
方法1:GROUP BY + HAVING 统计匹配数
这种方法通过筛选关联目标条目的记录,再按对象分组,统计匹配的唯一条目数是否等于目标数量(此处为2),以此确定同时关联两个条目的对象。
SELECT t1.id, t1.title FROM Table1 t1 JOIN Table3 t3 ON t1.id = t3.object_id JOIN Table2 t2 ON t3.item_id = t2.id WHERE t2.title IN ('item 2', 'item 3') GROUP BY t1.id, t1.title HAVING COUNT(DISTINCT t2.id) = 2;
逻辑说明:
- 关联三个表,筛选出所有关联
item 2或item 3的对象记录; - 按
Table1的id和title分组; - 通过
HAVING COUNT(DISTINCT t2.id) = 2确保该对象同时关联了两个不同的目标条目。
方法2:多次JOIN关联表
通过两次关联Table3和Table2,分别匹配item 2和item 3,只有同时满足两个关联条件的对象才会被保留。
SELECT t1.id, t1.title FROM Table1 t1 JOIN Table3 t3_2 ON t1.id = t3_2.object_id JOIN Table2 t2_2 ON t3_2.item_id = t2_2.id AND t2_2.title = 'item 2' JOIN Table3 t3_3 ON t1.id = t3_3.object_id JOIN Table2 t2_3 ON t3_3.item_id = t2_3.id AND t2_3.title = 'item 3';
逻辑说明:
- 第一次关联筛选出关联
item 2的对象; - 第二次关联筛选出关联
item 3的对象; - 只有同时通过两次关联的对象,才会出现在结果集中。
方法3:EXISTS 子查询验证
使用两个EXISTS子查询,分别检查当前对象是否关联了item 2和item 3,只有两个条件都满足的对象才会被选中。
SELECT t1.id, t1.title FROM Table1 t1 WHERE EXISTS ( SELECT 1 FROM Table3 t3 JOIN Table2 t2 ON t3.item_id = t2.id WHERE t3.object_id = t1.id AND t2.title = 'item 2' ) AND EXISTS ( SELECT 1 FROM Table3 t3 JOIN Table2 t2 ON t3.item_id = t2.id WHERE t3.object_id = t1.id AND t2.title = 'item 3' );
逻辑说明:
- 第一个
EXISTS验证对象是否关联item 2; - 第二个
EXISTS验证对象是否关联item 3; - 两个条件同时满足时,该对象才会被返回。
以上三种方法都能得到预期结果:object 2和object 3。
内容的提问来源于stack exchange,提问作者user2148956
相关产品推荐
相关产品推荐

