因此,我正在构建一个应用程序,其中一个元素是搜索电影。数据存储在关系数据库中。
其中一个过滤标准是流派。电影可以有多个类型,所以这是一个多对多的关系。除了通常的标签示例之外,过滤器的工作方式并不完全相同。
假设你有一部关于documentary和sports的纪录片。如果我对纪录片感兴趣,但对体育不感兴趣,我很可能对体育相关的纪录片不感兴趣。如果我像通常使用标签一样实现查询,查询将如下所示:
select distinct(m.id) from movies m
join genres_movies gm.movie_id = m.id
join genres on gm.genre_id = g.id
where genre.name in ('documentary', 'action', 'horror')通过这个查询,我会得到上面提到的体育纪录片。那么,如何排除具有特定类型的所有电影呢?
发布于 2021-03-02 05:29:35
我认为存在和“不存在”是你需要的
select distinct(m.id) from movies m
where exists (select 1
from genres g
join genres_movies gm
on gm.genre_id = g.id
where gm.movie_id = m.id
and name in ('documentary', 'action', 'horror'))
and not exists (select 1
from genres g
join genres_movies gm
on gm.genre_id = g.id
where gm.movie_id = m.id
and g.name not in ('sports', 'drama'))发布于 2021-03-02 07:22:55
我喜欢使用聚合来解决这类问题:
select gm.movie_id
from genres_movies gm join
genres g
on gm.genre_id = g.id
group by gm.movie_id
having sum(case when g.name in ('documentary', 'action', 'horror') then 1 else 0 end) > 0 and
sum(case when g.name = 'sports' then 1 else 0 end) = 0;> 0意味着至少分配了这些流派中的一个。= 0意味着这些类型都不会被分配。
因为您的代码只选择电影id,所以我删除了与movies的连接。当然,如果需要该表中的其他列,则将其放回int。
https://stackoverflow.com/questions/66429883
复制相似问题