Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando um limite em uma junção esquerda no mysql


Das edições e feedback dos comentários, aqui está a consulta que acho que você está procurando... A pré-consulta mais interna obtém as postagens e quem iniciou a postagem, comentários e quem postou os comentários. Essa consulta interna também é pré-classificada com os COMENTÁRIOS MAIS RECENTES no topo por postID. Usando o resultado disso, estou me juntando às variáveis ​​sql (@variables) para obter o @varRow aumentado toda vez que um novo comentário e redefinir para 1 toda vez que um ID de postagem for alterado (daí o PreQuery interno ordena por ID de postagem PRIMEIRO ). Por fim, usar a cláusula HAVING para ter a contagem @varRow do comentário <6 obterá no máximo 5 de cada postagem.

Se você quiser limitar quais postagens você está tentando recuperar, eu aplicaria uma cláusula WHERE (como data/hora, se disponível) no INNER mais que gera a "Pré-Consulta".
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

--- EDIT --- por comentárioAcho que o que você quer dizer com "Publicação Pai" a que os comentários estão associados é porque eles têm o ID da postagem diretamente. Como a consulta mais interna faz uma junção de todos os elementos/tabelas em todo o quadro, todos estão vindo para o passeio ...
Post -> User (to get posting user name )
Post -> Comment (on Common Post ID -- left joined)
        Comment -> User ( to get commenting user name)

Uma vez que tudo é feito e classificado por Post ID comum e o comentário mais recente classificado para o topo, aplico o @vars em TODAS as linhas retornadas. A cláusula HAVING removerá qualquer comentário em que sua sequência esteja ALÉM do 5 que você estava procurando.