如何编写SQL语句筛选关联全部指定Tag的MovieID
满足需求的SQL实现方案
方案1:GROUP BY + HAVING聚合筛选(通用高效,推荐使用)
SELECT MovieID FROM 你的表名 -- 替换成实际的表名称 WHERE TagID IN (1,3,5) GROUP BY MovieID HAVING COUNT(DISTINCT TagID) = 3;
逻辑说明:
- 先通过
WHERE TagID IN (1,3,5)过滤出所有匹配三个目标标签中任意一个的记录 - 按
MovieID分组,统计每个电影对应的不同标签数量 - 用
HAVING筛选出匹配标签数正好等于3的电影,也就是同时包含1、3、5三个标签的结果
注意:如果你的表中同一个MovieID和TagID的组合不会重复,可以把
COUNT(DISTINCT TagID)改成COUNT(*),执行性能会更好。
方案2:多次INNER JOIN实现(适合标签数量少的场景)
SELECT DISTINCT t1.MovieID FROM 你的表名 t1 INNER JOIN 你的表名 t2 ON t1.MovieID = t2.MovieID AND t2.TagID = 3 INNER JOIN 你的表名 t3 ON t1.MovieID = t3.MovieID AND t3.TagID = 5 WHERE t1.TagID = 1;
逻辑说明:
- 分别关联三次表,分别对应标签1、3、5的匹配条件,只有三个关联都命中的MovieID才会保留
- 适合标签固定且数量少的场景,标签数量较多时性能会比聚合方案差
以上两种方案运行你的示例数据后,返回的结果都是1和3,完全符合预期。
内容的提问来源于stack exchange,提问作者CDM
相关产品推荐
相关产品推荐

