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

MySQL三表关联查询疑问:为何不能直接用g.name!="Comedy"过滤?

为什么直接用WHERE g.name != "Comedy"无法正确筛选不含Comedy的剧集?
  • 核心问题:多类型剧集的关联记录过滤不彻底
    当你把tv_shows、tv_show_genres、tv_genres三表关联后,一个同时属于Comedy和其他类型的剧集,会生成多条关联记录——比如《XX剧》关联Comedy生成一条,关联Drama又生成一条。此时用WHERE g.name != "Comedy",只会过滤掉Comedy那条记录,但保留其他类型的记录,最终这个剧集还是会出现在结果里,而它实际上是包含Comedy类型的,不符合你的需求。

  • NOT IN子查询的逻辑是精准排除
    你朋友的写法是先通过子查询找出所有关联了Comedy类型的剧集ID,然后外层查询用NOT IN排除这些ID。这种方式是从剧集维度直接排除所有和Comedy沾边的剧集,不管它有多少其他类型,只要它属于Comedy,就会被彻底排除,所以能得到正确结果。

举个直观对比:
假设剧集《老友记》关联了Comedy和Drama两个类型,三表关联后会有两条记录:

  1. 《老友记》 | Comedy
  2. 《老友记》 | Drama

用WHERE g.name != "Comedy"会过滤掉第一条,但第二条保留,所以《老友记》会错误出现在结果里;而NOT IN子查询先拿到所有Comedy类型的剧集ID(包括《老友记》的ID),外层直接排除这些ID,《老友记》就不会出现在结果里,完全符合要求。

内容的提问来源于stack exchange,提问作者Cholthi Paul Ttiopic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:04:55