sql >> Base de Datos >  >> RDS >> Mysql

Usando un límite en una combinación izquierda en mysql

A partir de las ediciones y los comentarios de los comentarios, esta es la consulta que creo que está buscando... La consulta previa más interna obtendrá las publicaciones y quién inició la publicación, los comentarios y quién publicó los comentarios. Esta consulta interna también se ordena previamente con los COMENTARIOS MÁS RECIENTES en la parte superior por ID de publicación. Usando el resultado de eso, me estoy uniendo a las variables sql (@variables) para aumentar @varRow cada vez que un nuevo comentario y restablecer a 1 cada vez que cambia una ID de publicación (por lo tanto, las órdenes internas de PreQuery por ID de publicación PRIMERO ). Finalmente, al usar la cláusula HAVING para que el @varRow del comentario cuente <6 obtendrá como MÁXIMO 5 de cada publicación.

Si desea limitar las publicaciones que está tratando de recuperar, aplicaría una cláusula DONDE (como fecha/hora si está disponible) en la parte INTERNA más que genera la "Consulta previa".

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

--- EDITAR --- por comentario CREO que lo que quiere decir con qué "Publicación principal" están asociados los comentarios es porque tienen la identificación de la publicación directamente. Dado que la consulta más interna une todos los elementos/tablas en general, todos se unen para el viaje...

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

Una vez que ESO está todo hecho y ordenado por ID de publicación común y el comentario más reciente ordenado en la parte superior, aplico @vars contra TODAS las filas devueltas. La cláusula HAVING eliminará cualquier comentario donde su secuencia esté MÁS ALLÁ de los 5 que estabas buscando.