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

これが私がそれを解決した方法です(これらは両方とも、ツイートがASC
によって順序付けられていることを前提としています)tweet_id

解決策 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 に答える