sql >> Databasteknik >  >> RDS >> Mysql

Använder en gräns på en vänster join i mysql

Från redigeringarna och kommentarsfeedbacken, här är frågan jag tror du letar efter... Den inre förfrågan får inläggen och vem som startade inlägget, kommentarer och vem som postade kommentarerna. Denna inre fråga är också försorterad med de SENASTE KOMMENTARER högst upp per post-ID. Med hjälp av resultatet av det går jag med i sql-variablerna (@variables) för att få @varRow ökad varje gång en ny kommentar och återställs tillbaka till 1 varje gång ett inläggs-ID ändras (därav de inre PreQuery-ordningarna efter post-ID FIRST ). Slutligen, genom att använda HAVING-satsen för att få kommentarens @varRow-antal <6 kommer att få högst 5 av varje inlägg.

Om du vill begränsa vilka inlägg du försöker hämta, skulle jag tillämpa en WHERE-klausul (som datum/tid om tillgängligt) på INNER mest som genererar "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 kommentarJAG TROR att det du menar med vilket "föräldrainlägg" som kommentarerna är förknippade med är för att de har inläggets ID direkt. Eftersom den innersta frågan sammanfogar alla element/tabeller över hela linjen, följer alla med på resan...

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

När DET är gjort och sorterat efter vanligt inläggs-ID och den senaste kommentaren sorterad till toppen, tillämpar jag @vars mot ALLA returnerade rader. HAVING-satsen tar bort alla kommentarer där sekvensen är BUTOM de 5 du letade efter.



  1. Hämta det senaste (senaste) distinkta högsta värdet

  2. SQLSTATE[23000]:Överträdelse av integritetsbegränsning:1452 Kan inte lägga till eller uppdatera en underordnad rad:en främmande nyckel-begränsning misslyckas

  3. WordPress – Bakom kulisserna, del 2

  4. Hur man returnerar dagnumret med ett suffix i MariaDB