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

MySQL多对多关联查询:如何筛选同时匹配多分类的影片记录

问题根因
  • 原SQL的判断逻辑存在本质矛盾:单条movie_categories关联记录只会存储一个影片对应的单个分类ID,不可能同时满足category_id = 3 AND category_id =4,因此查询结果必然为空。
  • 把AND替换为OR的写法,会错误捞取仅绑定任意一个目标分类的影片(比如示例中仅绑定category_id=4的movie_id=2),完全不符合“同一影片必须同时绑定两个分类”的匹配要求。
修正实现

要匹配“同一影片同时绑定category_id为3和4”的目标,核心是 以影片为维度,校验该影片对应的关联记录集合中是否同时包含两个目标分类,常见的可落地写法有两种:

写法1:分组聚合校验(直观易维护)

SELECT m.title
FROM movies m
INNER JOIN movie_categories mc 
    ON m.id = mc.movie_id
WHERE mc.category_id IN (3, 4)
GROUP BY m.id, m.title
HAVING COUNT(DISTINCT mc.category_id) = 2

逻辑说明:

  • 先通过WHERE过滤出所有关联到目标分类的记录,减少后续分组计算的数据量
  • 按影片维度分组后,统计每个影片关联的去重分类数量等于2,即代表该影片同时绑定了两个目标分类
  • 对照给出的示例数据,该语句只会返回标题为tv - 1的影片,完全匹配业务要求

写法2:独立存在性校验(适配大表高性能场景)

SELECT m.title
FROM movies m
WHERE EXISTS (
    SELECT 1 FROM movie_categories mc 
    WHERE mc.movie_id = m.id AND mc.category_id = 3
)
AND EXISTS (
    SELECT 1 FROM movie_categories mc 
    WHERE mc.movie_id = m.id AND mc.category_id = 4
)

逻辑说明:逐影片校验其是否分别存在绑定category_id=3、category_id=4的关联记录,两个判断条件独立生效,不存在单条记录的逻辑矛盾,且能充分利用(movie_id, category_id)的联合索引提升查询效率。


内容的提问来源于stack exchange,提问作者Mr.Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 18:06:05