2013-02-07 66 views
0

對於我最後一個問題得到了很好的回答:Improving Efficiency of my SQL(謝謝@Bohemian)我現在意識到我有點短視,因爲還有一個額外的複雜因素。進一步提高SQL查詢的效率

使用相同的表像(像ID,用戶ID,對象ID,likeDate)的想法是,一個人每次有人喜歡一個對象喜歡它後喜歡1分。

在上一個問題的幫助下,我可以得到類似用戶喜歡的數量,但現在我需要考慮在這個問題中存在對象。

我希望能夠通過計算他們喜歡的每個對象之後所做的喜好來計算用戶有權獲得的點數(oooh這是一個凌亂的句子)。

我正在考慮進一步「嵌套」SQL,但這已經超出了我的聯盟,所以除了最後一個問題之外,我不能提供任何代碼。

+0

請添加您正在使用的SQL。 –

回答

0

您可以使用相關子查詢做到這一點:給定像什麼,這是做的是計數的對象上喜歡的數量,由其他用戶,之後

select l.userid, l.objectid, l.LikeDate, 
     (select count(*) from likes l2 where l2.objectid = l.objectid and l2.LikeDate >= l.likeDate and l2.userid <> l.userid 
     ) as NumLikesAfterward 
from likes l 

。它在likes的每行返回一行。計算使用select子句中的相關子查詢完成。

假設你有一個likes(objectid, likedate, userid)的索引,它將運行得更快。

要獲得總點數的用戶:

select sum(NumLikesAfterward) as TotalPoints 
from (select l.userid, l.objectid, l.LikeDate, 
      (select count(*) from likes l2 where l2.objectid = l.objectid and l2.LikeDate >= l.likeDate and l2.userid <> l.userid 
      ) as NumLikesAfterward 
     from likes l 
     where userid = $userid 
    ) uol 
+0

欣賞 - 我今晚晚些時候會試用,如果它有效,標記爲「答案」。 – tommyd456

+0

好吧,稍微調整一下,以允許用戶標識傳遞到查詢中,正如你所說的那樣,它返回許多不同的行。那麼你會推薦一個簡單的PHP循環來獲得總分數? – tommyd456

+0

@ tommyd456。 。 。不,我認爲你不應該在PHP中這樣做。在SQL中執行操作非常簡單。 –