Mysql
 sql >> Database >  >> RDS >> Mysql

Utilizzo di un limite su un join sinistro in mysql

Dalle modifiche e dal feedback sui commenti, ecco la query che penso tu stia cercando... La prequery più interiore riceve i post e chi ha avviato il post, i commenti e chi ha pubblicato i commenti. Questa query interna è anche preordinata con i COMMENTI PIÙ RECENTI all'inizio per ID post. Usando il risultato di ciò, mi unisco alle variabili sql (@variables) per ottenere @varRow aumentato ogni volta che un nuovo commento e ripristinato a 1 ogni volta che un ID post cambia (da qui gli ordini PreQuery interni per ID post PRIMA ). Infine, utilizzando la clausola HAVING per fare in modo che il conteggio di @varRow <6 del commento raggiunga MASSIMO 5 di ogni post.

Se vuoi limitare i post che stai cercando di recuperare, applicherei una clausola WHERE (come data/ora se disponibile) al massimo INNER che genera la "Prequery".

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 --- per commentoPenso che cosa intendi con "Post principale" a cui sono associati i commenti è perché hanno direttamente l'ID del post. Poiché la query più interna esegue un join di tutti gli elementi/tabelle su tutta la linea, tutti stanno arrivando per il giro...

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

Una volta che QUELLO è stato eseguito e ordinato in base all'ID post comune e al commento più recente ordinato in alto, applico @vars a TUTTE le righe restituite. La clausola HAVING eliminerà qualsiasi commento la cui sequenza è OLTRE i 5 che stavi cercando.