mysql跟随和转推类似的功能

时间:2012-11-23 10:38:11

标签: mysql performance twitter group-by twitter-follow

这是一个有点挑战但有趣的问题。 考虑使用这些表

鸣叫

tweet_id | retweet_of_id | user_id

遵循

user_id | followed_user_id

因此,我们将每个“转推”存储为指向原始推文ID(retweet_of_id)的单独的推文。这是因为我想分别在每一个下面发表评论。 如果某些内容不是转发,则retweet_of_id将为0

如何使用MySQL 高效

检索以下内容
  • 我自己的推文
  • 所有原始推文(来自我关注的用户)
  • 推文(来自我关注的用户)的第一次转推(来自我不遵循的用户)

结果应该是两者的组合(按顺序),就像推特的做法一样 请考虑可能有1,000,000条推文,我们只需要最新的推文(例如:10)。


以下是示例(我是用户1,我关注用户2& 3)

tweet_id | retweet_of_id | user_id
----------------------------------
    1            0            4          <- EXCLUDE (I don't follow user 4)
    2            0            2          <- INCLUDE (I follow user 2)
    3            0            3          <- INCLUDE (I follow user 3)
    4            1            2          <- INCLUDE (I follow user 2 & first RT)
    5            1            3          <- EXCLUDE (I already have the first RT)
    6            2            3          <- EXCLUDE (I already have the orignal)
    7            0            1          <- INCLUDE (My own tweet)

所以最后的订单应该是这些推文:7, 4, 3, 2 (从最新的开始)

2 个答案:

答案 0 :(得分:1)

以下是我如何解决的问题 (两者均假设推文按其tweet_id ASC排序)

解决方案1 ​​(正确,快速运行)

SELECT tweet_id,
FROM tweets 
WHERE user = 1 OR user IN (2,3)  
GROUP BY  IF(retweet_of_id = 0, tweet_id, retweet_of_id)
ORDER BY tweet_id DESC

解决方案2 (给出了正确的结果,但对于1,000,000条推文来说它的速度很慢)

SELECT p1.tweet_id FROM tweets p1 
LEFT JOIN tweets p2 
       ON p2.user IN (2,3)
      AND p1.tweet_id > p2.tweet_id
      AND (p1.retweet_of_id = p2.tweet_id 
           OR p1.retweet_of_id AND p1.retweet_of_id = p2.retweet_of_id )
WHERE p2.tweet_id IS NULL
  AND (p1.user = 1 OR p1.user IN (2,3)) 
ORDER BY p1.tweet_id DESC

答案 1 :(得分:0)

所有原始推文(来自我关注的用户)

我关注的1个用户:

select user_id from follow where followed_user_id= MyOwnID

2所有原始推文:

select * from tweets where retweed_of_id=0

两者合并:

select * from tweets where retweed_of_id=0 and
user_id in (select user_id from follow where followed_user_id= MyOwnID)

应该是它 - 还是我错过了什么?