这是一个有点挑战但有趣的问题。 考虑使用这些表
鸣叫
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
(从最新的开始)
答案 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)
应该是它 - 还是我错过了什么?