如果我有这样的表结构
[movies]---<[movies_genres]>---[genres]---<[users_genres]>---[users]
我想在user.id
的情况下仅查询与users_genres.genre_id
分享其流派的电影。
更清楚一点,如果用户喜欢{sci-fi,action和romance}类型但是电影是{sci-fi,action和horror},则不应该返回电影。但是,如果电影只是{sci-fi}或{sci-fi,action},则应该返回。因此,如果它具有未在用户首选类型中列出的类型,则不应返回该类型。
我该怎么做?
感谢。
修改:
我试过的东西
select movies_id from movies_genres mg
where mg.genres_id not in (
select genres_id from users_genres ug
where ug.users_id = 1
)
EDIT2:
好的,我修复了上面的代码,我觉得它似乎正在运作
select * from movies
where movies.id not in (
select movies_id from movies_genres mg
where mg.genres_id not in (
select genres_id from users_genres ug
where ug.users_id = 2
)
)
我基本上在玩减法集(我认为)。这对我来说都是全新的,所以我甚至不清楚SQL在这里是如何工作的。就是这样,如果我可以从另一个中减去一个集合而结果是空的,那么它就是一个子集。这基本上符合我对movie_genres作为users_genres子集的要求。
答案 0 :(得分:0)
join
和aggregation
应在表格之间起作用:
select mg.movie_id
from user_genres ug left join
movie_genres mg
on mg.genre_id = ug.genre_id
where ug.user_id = ?
group by mg.movie_id
having count(*) = count(ug.genre_id); -- do all match
编辑:
如果你只想要完全匹配,那么一个简单的方法是创建一个类型列表并匹配:
select mg.movie_id
from (select mg.movie_id, group_concat(mg.genre_id order by mg.genre_id) as genres
from movie_genres mg
group by mg.movie_id
) mg join
(select group_concat(ug.genre_id order by ug.genre_id) as genres
from user_genres ug
where ug.user_id = ?
) ug
on mg.genres = ug.genres;