Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation d'une limite sur une jointure gauche dans mysql

D'après les modifications et les commentaires des commentaires, voici la requête que je pense que vous recherchez ... La requête la plus interne obtiendra les publications et qui a lancé la publication, les commentaires et qui a publié les commentaires. Cette requête interne est également pré-triée avec les COMMENTAIRES LES PLUS RÉCENTS en haut par postID. En utilisant le résultat de cela, je me joins aux variables sql (@variables) pour obtenir le @varRow augmenté à chaque fois qu'un nouveau commentaire et remis à 1 chaque fois qu'un ID de publication change (d'où les commandes PreQuery internes par ID de publication FIRST ). Enfin, l'utilisation de la clause HAVING pour que le compte @varRow du commentaire <6 obtienne au MOST 5 de chaque message.

Si vous souhaitez limiter les publications que vous essayez de récupérer, j'appliquerais une clause WHERE (telle que date/heure si disponible) au maximum INNER qui génère 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 commentJe pense que ce que vous entendez par "Parent Post" auquel les commentaires sont associés, c'est parce qu'ils ont directement l'ID de publication. Étant donné que la requête la plus interne effectue une jointure de tous les éléments/tables à travers le tableau, tous arrivent pour le voyage...

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

Une fois que tout est fait et trié par ID de publication commun et commentaire le plus récent trié en haut, j'applique ensuite les @vars à TOUTES les lignes renvoyées. La clause HAVING supprimera tout commentaire dont la séquence est AU-DELÀ des 5 que vous recherchiez.