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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:01:34