假设以下表格:
User
----
id
name
Rating
------
userid
movieid
value
Movie
-----
id
title
movie_genre
-----------
movieid
genreid
genre
-----
id
value
我认为这里的外键很明显。我正在寻找的查询如下:
电影A是一种类型为X的电影,我和其他一些用户都评价为5.我希望电影B也被X类型评为上述五个用户之一。
我认真找不到它......加入的数量不一定是btw的问题,可以有很多。
编辑:如果我不清楚。这里的想法是人们可能在一种类型中具有相似的品味,但在另一种类型中具有非常不同的品味。我可能会喜欢其他人喜欢的那种特定类型的电影。
答案 0 :(得分:0)
这就是我认为您正在寻找的内容:
鉴于用户John,找到所有电影B,以便存在电影A,用户Simon和类型G,其中:
这样说,我认为提出查询非常容易:
select B.*
from user John
join rating JohnA on JohnA.userid = John.id and JohnA.value = 5
join movie A on A.id = JohnA.movieid
join rating ASimon on ASimon.movieid = A.id and ASimon.value = 5
join user Simon on Simon.id = ASimon.userid and Simon.id <> John.id
join rating SimonB on SimonB.userid = Simon.id and SimonB.value =5
join movie B on B.id = SimonB.movieid
join movie_genre Agenre on Agrenre.movieID = A.id
join genre G on G.id = Agenre.genreid
join movie_genre Bgenre on Bgenre.genreid = G.id and Bgenre.movieid = B.id
你选择的数据库可能会优化它以删除一些连接,但我们只需要关系(评级)而不是中间对象(电影A,用户Simon和类型G):
select B.*
from user John
join rating JohnA on JohnA.userid = John.id and JohnA.value = 5
join rating ASimon on ASimon.movieid = JohnA.movieid and ASimon.value = 5 and ASimon.userid <> John.id
join rating SimonB on SimonB.userid = ASimon.userid and SimonB.value =5
join movie B on B.id = SimonB.movieid
join movie_genre Agenre on Agrenre.movieID = A.id
join movie_genre Bgenre on Bgenre.genreid = Agenre.genreid and Bgenre.movieid = B.id