sql >> データベース >  >> RDS >> Mysql

mysqlでの左結合の制限の使用

    編集とコメントのフィードバックから、これがあなたが探していると思うクエリです...最も内側のprequeryは投稿を取得し、誰が投稿を開始したか、コメント、誰がコメントを投稿したかを示します。この内部クエリも、postIDごとに最上位のMOSTRECENTCOMMENTSで事前に並べ替えられています。その結果を使用して、SQL変数(@variables)に参加し、新しいコメントのたびに@varRowを増やし、投稿IDが変更されるたびに1にリセットします(したがって、内部のPreQueryは投稿IDFIRSTで順序付けます)。最後に、HAVING句を使用してコメントの@varRow count <6を設定すると、各投稿のMOST5に到達します。

    取得しようとしている投稿を制限したい場合は、「PreQuery」を生成する最も内側のINNERにWHERE句(利用可能な場合は日付/時刻など)を適用します。

    select straight_join
          PreQuery.*,
          @varRow := if( @LastPost = PreQuery.PostID, @varRow +1, 1 ) CommentRow,
          @LastPost := PreQuery.PostID PostID2
       from
          ( select
                  posts.id PostID,
                  posts.body,
                  posts.CreatedAt,
                  u1.id UserID,
                  u1.DisplayName NameOfPoster,
                  c.id,
                  c.userid CommentUserID,
                  c.text CommentText,
                  u2.DisplayName CommentUserName
               from
                  posts
                     join users u1
                        on posts.ownerUserID = u1.id
    
                     LEFT JOIN comments c
                        on posts.id = c.PostID
    
                        join users u2
                           on c.userid = u2.id 
                where
                      posts.id = TheOneParentIDYouWant
                   OR posts.parentid = TheOneParentIDYouWant
                order by
                   posts.ID,
                   c.id desc ) PreQuery,
    
          (select @varRow := 0, @LastPost = 0 ) SQLVars
    
       having
          CommentRow < 6   
    
       order by
          PreQuery.postid,
          CommentRow
    

    ---編集---コメントごとにコメントが関連付けられている「親の投稿」の意味は、投稿IDが直接あるためだと思います。最も内側のクエリは、すべての要素/テーブルを全面的に結合するため、すべてが乗り物に乗っています...

    Post -> User (to get posting user name )
    Post -> Comment (on Common Post ID -- left joined)
            Comment -> User ( to get commenting user name)
    

    それがすべて完了し、共通の投稿IDで並べ替えられ、最新のコメントが一番上に並べ替えられたら、返されたすべての行に対して@varsを適用します。 HAVING句は、シーケンスが探していた5を超えているコメントをすべて削除します。



    1. mysqlを使用したMeteor

    2. Oracleでvarcharを個別の列に分割する

    3. 挿入された行のインデックスを取得する

    4. ElasticSearchでユーザーの検索クエリを保存する最良の方法は?