在一个表中选择与另一个表中的id至少匹配的所有ID

时间:2018-02-25 18:01:15

标签: mysql sql

如果我有这样的表结构

[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子集的要求。

1 个答案:

答案 0 :(得分:0)

joinaggregation应在表格之间起作用:

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;