gpt4 book ai didi

mysql - 选择一个表中与另一表中至少相同数量的 id 匹配的所有 id

转载 作者:行者123 更新时间:2023-11-29 17:54:35 26 4
gpt4 key购买 nike

如果我有这样的表结构

[movies]---<[movies_genres]>---[genres]---<[users_genres]>---[users]

在给定 user.id 的情况下,我只想查询与 users_genres.genre_id 共享类型的电影。

更清楚地说,如果用户喜欢类型{科幻、 Action 和浪漫},但电影是{科幻、 Action 和恐怖},则不应返回该电影。但是,如果电影只是{科幻}或{科幻, 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
)

编辑2:

好的,我已经修复了上面的代码,我认为它似乎可以工作

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

最佳答案

联接聚合应该在表之间起作用:

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;

关于mysql - 选择一个表中与另一表中至少相同数量的 id 匹配的所有 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48976676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com