Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden eines Limits für einen linken Join in MySQL

Aus den Bearbeitungen und dem Kommentar-Feedback ist hier die Abfrage, nach der Sie meiner Meinung nach suchen ... Die innerste Vorabfrage erhält die Posts und wer den Post initiiert hat, Kommentare und wer die Kommentare gepostet hat. Auch diese innere Abfrage ist mit den NEUESTEN KOMMENTAREN nach oben pro PostID vorsortiert. Mit dem Ergebnis davon verbinde ich mich mit den SQL-Variablen (@variables), um die @varRow jedes Mal zu erhöhen, wenn ein neuer Kommentar kommt, und jedes Mal, wenn sich eine Post-ID ändert, auf 1 zurückzusetzen (daher die inneren PreQuery-Ordnungen nach Post-ID ZUERST ). Wenn Sie schließlich die HAVING-Klausel verwenden, um die @varRow-Anzahl des Kommentars <6 zu haben, werden die MEISTEN 5 jedes Beitrags erreicht.

Wenn Sie einschränken möchten, welche Posts Sie abrufen möchten, würde ich eine WHERE-Klausel (z. B. Datum/Uhrzeit, falls verfügbar) am INNEREN anwenden, die die "PreQuery" generiert.

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

--- BEARBEITEN --- pro Kommentar Ich denke, was Sie mit dem "übergeordneten Beitrag" meinen, mit dem die Kommentare verknüpft sind, ist, weil sie die Beitrags-ID direkt haben. Da die innerste Abfrage alle Elemente/Tabellen auf der ganzen Linie verbindet, kommen alle mit auf die Reise...

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

Sobald DAS alles erledigt und nach der gemeinsamen Beitrags-ID und dem neuesten Kommentar nach oben sortiert ist, wende ich dann die @vars auf ALLE zurückgegebenen Zeilen an. Die HAVING-Klausel entfernt alle Kommentare, deren Sequenz JENSEITS der 5 ist, nach denen Sie gesucht haben.