You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多对多表中如何查询同时匹配多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:02:37