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

关联表中如何筛选同时属于指定多个分类的视频

筛选同时属于多个指定分类的视频

要找出同时属于category_id=1和category_id=2的视频,排除仅属于其中一个或均不属于的情况,这里提供几种实用的SQL实现方法:

方法一:分组统计法(最常用)

通过分组统计每个视频关联的目标分类数量,筛选出数量等于目标分类总数的视频:

-- 先获取符合条件的视频ID
SELECT video_id
FROM Categories_Videos
WHERE category_id IN (1, 2)
GROUP BY video_id
HAVING COUNT(DISTINCT category_id) = 2;

如果需要获取视频的完整信息,只需关联Videos表:

SELECT v.*
FROM Videos v
INNER JOIN (
    SELECT video_id
    FROM Categories_Videos
    WHERE category_id IN (1, 2)
    GROUP BY video_id
    HAVING COUNT(DISTINCT category_id) = 2
) qualified_videos ON v.id = qualified_videos.video_id;

使用COUNT(DISTINCT)是为了避免同一视频重复关联同一分类的异常情况;如果你的Categories_Videos表能保证一个视频对应一个分类仅存一条记录,也可以简化为COUNT(*) = 2。

方法二:自连接法

通过两次关联Categories_Videos表,分别匹配两个目标分类:

SELECT DISTINCT v.*
FROM Videos v
INNER JOIN Categories_Videos cv1 
    ON v.id = cv1.video_id AND cv1.category_id = 1
INNER JOIN Categories_Videos cv2 
    ON v.id = cv2.video_id AND cv2.category_id = 2;

这种方法逻辑直白易懂,适合需要匹配的分类数量较少的场景。

方法三:EXISTS子查询法

通过两次子查询验证视频是否同时存在于两个分类的关联记录中:

SELECT v.*
FROM Videos v
WHERE EXISTS (
    SELECT 1 
    FROM Categories_Videos cv 
    WHERE cv.video_id = v.id AND cv.category_id = 1
)
AND EXISTS (
    SELECT 1 
    FROM Categories_Videos cv 
    WHERE cv.video_id = v.id AND cv.category_id = 2
);

如果Categories_Videos表在video_id和category_id上建有联合索引,这种方法的查询效率会比较出色。

内容的提问来源于stack exchange,提问作者RunyanAvenue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:00:59