PostgreSQL如何根据指定两个tag_id筛选关联的唯一video_id
如何查询同时拥有指定标签的唯一视频ID?
假设我们有一张关联表 tags_videos,数据如下:
tag_id | video_id --------+---------- 1195 | 15033 1198 | 15033 1199 | 15033 1196 | 15034 1198 | 15034 1199 | 15034 1197 | 15035 1198 | 15035 1199 | 15035 1195 | 15036 1197 | 15036 1198 | 15036
需求是找出同时拥有指定多个tag_id的唯一video_id,比如指定tag_id为1195和1198时,结果应为15033和15036。以下是几种可行的实现方式:
方法1:GROUP BY + HAVING 统计匹配数
这是最通用的方案,适用于所有支持标准SQL的数据库:
SELECT video_id FROM tags_videos WHERE tag_id IN (1195, 1198) GROUP BY video_id HAVING COUNT(DISTINCT tag_id) = 2;
说明
WHERE tag_id IN (1195, 1198)先过滤出包含目标标签的记录GROUP BY video_id按视频ID分组HAVING COUNT(DISTINCT tag_id) = 2筛选出分组内恰好包含2个不同目标标签的视频(如果表中不会出现同一视频同一标签重复的情况,可以去掉DISTINCT)
方法2:子查询 + 内连接
通过多次筛选并做内连接,确保视频同时存在于多个标签的结果集中:
SELECT DISTINCT t1.video_id FROM tags_videos t1 INNER JOIN tags_videos t2 ON t1.video_id = t2.video_id WHERE t1.tag_id = 1195 AND t2.tag_id = 1198;
说明
- 分别筛选出拥有1195和1198标签的视频ID,通过内连接取交集,最后用
DISTINCT确保结果唯一
方法3:使用INTERSECT(部分数据库支持)
如果你的数据库支持INTERSECT(如PostgreSQL、SQL Server等),可以直接取两个查询的交集:
SELECT video_id FROM tags_videos WHERE tag_id = 1195 INTERSECT SELECT video_id FROM tags_videos WHERE tag_id = 1198;
说明
INTERSECT会自动返回两个查询结果的交集,且结果天然去重
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

