5

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

推文

tweet_id | retweet_of_id | user_id

跟随

user_id | followed_user_id

因此,我们将每个“转推作为单独的推文”存储为指向原始推文的 id ( retweet_of_id)。这是因为我想分别在每一项下发表评论。如果某事不是转推,那么retweet_of_id将是0

如何有效地使用 MySQL 检索以下内容?

  • 我自己的推文
  • 所有原始推文(来自我关注的用户)
  • 以及推文的第一次转推(由我关注的用户)(来自我不关注的用户)

并且结果应该是两者的组合(按顺序),就像 twitter 所做的那样。
请考虑可能有 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 从最近的开始)

4

2 回答 2

1

这是我解决它的方法
(这两个都假设推文是由他们的tweet_idASC 排序的)

解决方案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
于 2012-12-01T11:48:20.183 回答
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)

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

于 2012-11-23T12:56:03.827 回答