2012-06-29 55 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中使用了子查詢,這是一種糟糕的,不良的做法。因此,看看我對 –