进一步提高SQL查询的效率

时间:2013-02-07 14:06:46

标签: mysql sql

对我的上一个问题得到了很好的答案:Improving Efficiency of my SQL(感谢@Bohemian)我现在意识到我有点近视,因为有一个额外的复杂性。

使用相同的表LIKES(如ID,userID,objectID,likeDate)的想法是,每个人在喜欢它后喜欢它时,每人获得1分。

在上一个问题的帮助下,我可以在用户喜欢之后得到喜欢的数量,但现在我需要考虑这个问题中有对象。

我希望能够计算用户有权获得的分数,方法是计算他们所喜欢的每个对象之后为他们制作的相似内容(哦,这是一个混乱的句子)。

我正在考虑进一步“嵌套”SQL,但这不属于我的联盟,因此除了上一个问题之外我无法提供任何其他代码。

1 个答案:

答案 0 :(得分: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