mysql跟踪和转发功能
这是一个有点挑战性但很有趣的问题。 考虑这些表 推特mysql跟踪和转发功能,mysql,performance,twitter,group-by,twitter-follow,Mysql,Performance,Twitter,Group By,Twitter Follow,这是一个有点挑战性但很有趣的问题。 考虑这些表 推特 tweet_id | retweet_of_id | user_id 跟随 user_id | followed_user_id 因此,我们将每个“retweet”存储为指向原始tweet的id(retweet\u of\u id)的单独的tweet”。这是因为我想在每一个单独的评论。 如果某个内容不是转发,则id的转发将是0 如何使用MySQL高效地检索以下内容 我自己的推特 所有原始推文(来自我关注的用户) 以及(我不关注的用户)推
tweet_id | retweet_of_id | user_id
跟随
user_id | followed_user_id
因此,我们将每个“retweet”存储为指向原始tweet的id(retweet\u of\u id
)的单独的tweet”。这是因为我想在每一个单独的评论。
如果某个内容不是转发,则id的转发将是0
如何使用MySQL高效地检索以下内容
- 我自己的推特
- 所有原始推文(来自我关注的用户)
- 以及(我不关注的用户)推特的第一次转发(由我关注的用户转发)
结果应该是两者(按顺序)的结合,就像twitter那样。
请考虑可能有1000000条推特,我们只需要最近的一条(例如:10)。
下面是一个示例(我是用户1,我关注用户2和3)
tweet_id | retweet_of_id | user_id
----------------------------------
1 0 4所有原始推文(来自我关注的用户)
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)
应该是这样,还是我错过了什么?以下是我如何解决的
(这两个都假设tweet是按其tweet\u id
ASC排序的)
解决方案1(正确,运行速度快)
解决方案2(给出了正确的结果,但对于1000000条推文来说速度很慢)
是的,我知道如何得到这些。棘手的部分是第二点,关于tweet的第一次转发(由我关注的用户转发)(由我不关注的用户转发)。结果应该是一个与原始推文(按顺序)的组合列表。就像twitter是这样做的。你需要一个自动增量id来实现这一点,必须修改我的上例以重新删除\u的id0,并且必须将答案限制为1(因此你只需要获得你所知道的用户的第一条重新发布的tweet)。有了另一个子选择,你可以把它限制在你不认识的人的推特上!你能修改你的答案让我明白你的意思吗?我还添加了一个示例。也许会有帮助。你在哪里能找到最好的查询?我也面临着同样的问题:)是的,我在回答中发布了我的解决方案。:-)
select * from tweets where retweed_of_id=0 and
user_id in (select user_id from follow where followed_user_id= MyOwnID)
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
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