多对多表中如何查询同时匹配多个TagId的EventId?
问题描述
我有一张存储EventId和TagId的多对多关系表,表数据如下:
+-------+---------+ | TagId | EventId | +-------+---------+ | 150 | 61096 | | 149 | 61096 | | 149 | 61095 | +-------+---------+
需要查询同时匹配TagId 149和TagId 150的EventId,期望结果:
+---------+ | EventId | +---------+ | 61096 | +---------+
解决方案
以下是几种实用的查询方法:
方法1:GROUP BY + HAVING 统计匹配数
这是处理这类多标签匹配问题最常用的方式:
SELECT EventId FROM your_table_name WHERE TagId IN (149, 150) GROUP BY EventId HAVING COUNT(DISTINCT TagId) = 2;
- 逻辑:先用
WHERE过滤出包含目标TagId的记录,再按EventId分组,最后通过HAVING子句统计分组内不同TagId的数量,等于2则说明该EventId同时拥有两个目标标签。加DISTINCT是为了避免同EventId同TagId重复数据干扰统计结果。
方法2:自连接(Self Join)
通过表自连接来匹配同时满足两个标签条件的EventId:
SELECT t1.EventId FROM your_table_name t1 JOIN your_table_name t2 ON t1.EventId = t2.EventId WHERE t1.TagId = 149 AND t2.TagId = 150;
- 逻辑:将表分别以
t1和t2别名关联,t1筛选出TagId为149的记录,t2筛选出TagId为150的记录,通过EventId关联后,得到同时存在两个标签的结果。
方法3:子查询 + EXISTS
用EXISTS判断每个EventId是否同时存在两个目标标签的对应记录:
SELECT DISTINCT EventId FROM your_table_name t1 WHERE TagId = 149 AND EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.EventId = t1.EventId AND t2.TagId = 150 );
- 逻辑:先筛选出所有带TagId 149的EventId,再通过
EXISTS子查询检查这些EventId是否存在TagId 150的记录,最后用DISTINCT去除可能的重复结果。
内容的提问来源于stack exchange,提问作者Simpler
相关产品推荐
相关产品推荐

