【问题标题】:mysql follow and retweet-like functionalitymysql 关注和转发类似的功能
【发布时间】:2012-11-11 17:10:47
【问题描述】:

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

推文

tweet_id | retweet_of_id | user_id

关注

user_id | followed_user_id

因此,我们将每个“转推”存储为指向原始推文 ID (retweet_of_id) 的单独推文。这是因为我想在每个下面分别放置 cmets。 如果某事不是转推,则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(从最近的开始)

【问题讨论】:

  • 您在哪里可以找到最好的查询?我也面临同样的问题:)
  • 是的,我在答案中发布了我的解决方案。 :-)

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


【解决方案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

【讨论】:

    【解决方案2】:

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

    我关注的 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)
    

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

    【讨论】:

    • 是的,我知道如何获得这些。棘手的部分是关于推文(来自我不关注的用户)的 first 转推(由我关注的用户)的第二点。结果应该是与原始推文的组合列表(按顺序)。就像 twitter 做的一样。
    • 您将需要一个自动增量 ID,必须将我的上例修改为 retweed_of_id0 并且必须将答案限制为 1(因此您只需获得您认识的用户的第一个 re_tweets)。拥有另一个子选择,您可以将其限制为您不认识的人的推文!
    • 你能修改你的答案,让我明白你的意思吗?我还添加了一个示例。也许有帮助。
    猜你喜欢
    • 2011-02-28
    • 2015-11-21
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多