Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql跟踪和转发功能_Mysql_Performance_Twitter_Group By_Twitter Follow - Fatal编程技术网

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