针对建议的复杂SQL查询

时间:2013-06-28 15:16:16

标签: sql recommendation-engine

假设以下表格:

User
----
id
name

Rating
------
userid
movieid
value

Movie
-----
id
title

movie_genre
-----------
movieid
genreid

genre
-----
id
value

我认为这里的外键很明显。我正在寻找的查询如下:

电影A是一种类型为X的电影,我和其他一些用户都评价为5.我希望电影B也被X类型评为上述五个用户之一。

我认真找不到它......加入的数量不一定是btw的问题,可以有很多。

编辑:如果我不清楚。这里的想法是人们可能在一种类型中具有相似的品味,但在另一种类型中具有非常不同的品味。我可能会喜欢其他人喜欢的那种特定类型的电影。

1 个答案:

答案 0 :(得分:0)

这就是我认为您正在寻找的内容:

鉴于用户John,找到所有电影B,以便存在电影A,用户Simon和类型G,其中:

  • John评为电影A a 5
  • 西蒙评为电影A a 5
  • 西蒙不是约翰
  • 西蒙评为电影B a 5
  • 电影A属于G类型
  • 电影B属于类型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