2012-06-29 63 views
2

需要帮助使这种(某种)工作查询更具动态性。SQL最近邻居查询(电影推荐算法)

我有三个表myShows,TVShows和用户

  • myShows
    • ID(PK)
    • 用户(FK到用户)
    • 显示(FK到TVShows)

想借此查询和更改e它存储过程,我可以发送用户ID,并让它做其余的...

SELECT showId, name, Count(1) AS no_users 
FROM 
    myShows LEFT OUTER JOIN 
       tvshows ON myShows.Show = tvshows.ShowId 
WHERE 
    [user] IN (
     SELECT [user] 
      FROM 
       myShows 
      WHERE 
       show ='1' or show='4' 
     ) 
    AND 
    show <> '1' and show <> '4' 
GROUP BY 
    showId, name 
ORDER BY 
    no_users DESC 

现在这个工程。但是,正如你所看到的,问题出在WHERE(show ='1'或show ='4')和AND(显示<>'1'并显示<>'4')硬编码的值,这就是我需要的动态,因为我不知道用户是否有3或30个需要检查的节目。

这个过程又如何低效?这将用于iPad应用程序,可能会得到很多用户。我目前运行一个电影API(IMDbAPI.com),每小时获得大约130k的点击率,并且必须进行大量的数据库/代码优化才能使其运行速度更快。再次感谢!

如果你想让测试的数据库模式让我知道。

+0

可以将序列和/或序列转换为IN ... VALUES(1),(4)...'help? http://sqlfiddle.com/#!6/0dceb/13 – biziclop

+1

我在sqlfiddle上重新创建了这个问题:http://sqlfiddle.com/#!3/84311/1/0 缺少的核心内容之一是[用户]逻辑...它不知道什么显示甚至检查。 上面的示例将看到User1喜欢showId 1和2,User2喜欢1和3,运行该查询时,它将返回3,这是正确的。但我的查询仍然有硬编码的值。 – bfritz

+0

为什么3在你的例子中是正确答案?你想达到什么目的? – podiluska

回答

1

这将满足您的要求

select name, count(distinct [user]) from myshows recommend 
inner join tvshows on recommend.show = tvshows.showid 
where [user] in 
( 
    select other.[user] from 
     (select show from myshows where [User] = @user) my, 
     (select show, [user] from myshows where [user] <> @user) other 
    where my.show = other.show 
) 
and show not in (select show from myshows where [User] = @user) 
group by name 
order by count(distinct [user]) desc 

如果你的SQL平台支持WITH公用表表达式,上面可以优化使用它们。

随着数据量的增加,效率会提高吗?号码 它会有效吗?不是。如果只有一个用户与您选择的用户共享节目,并且他们观看流行节目,则该流行节目将升至排名的前列。

我建议

一)审查您的建议是什么表演

b思维)定期计算的结果,而不是按需执行它。

+0

工作!另外,一旦我将“And xxx Not In”添加到我的查询中,它将删除它自己的结果,这是我目前所坚持的结果!谢谢。也没有什么东西在数据库中“流行”,直到很多用户添加它,并且他们将不得不分享大量相同的节目以使count()权重更高。如果你观看A和B以及另外5000人观看A或B和C ......也许你应该结账C?这就是它的工作原理。 – bfritz

+0

是的。但是,如果我看槌球和真正的网球和一个gazillion人观看足球,一个人看足球和槌球,我应该尝试足球?或者,我更有可能对其他观看*槌球和真实网球的人都感兴趣?然后它变得更有趣/复杂...... – podiluska

+0

这在WHERE中使用了子查询,这是一种糟糕的,不良的做法。因此,看看我对 –