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
相关产品推荐
相关产品推荐

