如何通过SQL GROUP BY操作排除包含指定类型的电影数据?
修改SQL以排除含指定类型的电影结果
现有三张表:movies(电影表)、genres(类型表)、moviesgenres(电影与类型的关联中间表),执行以下分组查询SQL:
select mov.name, count(mgen.genreId) from movies mov inner join moviesGenres mgen on mov.id = mgen.movieId inner join genres gen on mgen.genreid = gen.id group by mov.name having count(mgen.genreId) > 2
原查询返回结果如下:
Bad Boys 3 Novelty 3
已知Bad Boys包含Comedy类型,需求为仅保留不含Comedy类型的电影结果(即仅保留Novelty 3),以下两种方式均可实现需求:
方法一:用NOT EXISTS预筛选排除含Comedy的电影
select mov.name, count(mgen.genreId) from movies mov inner join moviesGenres mgen on mov.id = mgen.movieId inner join genres gen on mgen.genreid = gen.id -- 筛选出未关联Comedy类型的电影 where not exists ( select 1 from moviesGenres mgen2 inner join genres gen2 on mgen2.genreid = gen2.id where mgen2.movieId = mov.id and gen2.name = 'Comedy' ) group by mov.name having count(mgen.genreId) > 2
思路:通过子查询检查当前电影是否关联了Comedy类型,用NOT EXISTS直接排除这类电影,再执行原有的分组统计逻辑。
方法二:在HAVING子句中排除含Comedy的分组
select mov.name, count(mgen.genreId) from movies mov inner join moviesGenres mgen on mov.id = mgen.movieId inner join genres gen on mgen.genreid = gen.id group by mov.name having count(mgen.genreId) > 2 -- 确保当前电影的类型中没有Comedy and sum(case when gen.name = 'Comedy' then 1 else 0 end) = 0
思路:在分组后的筛选逻辑中,新增统计当前电影分组里Comedy类型的数量,要求该数量为0,以此排除包含Comedy类型的电影。
内容的提问来源于stack exchange,提问作者Rikky Bhai
相关产品推荐
相关产品推荐

