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

Brug af en grænse på en venstre join i mysql

Fra redigeringer og kommentarfeedback, her er den forespørgsel, jeg tror, ​​du leder efter... Den inderste viljeforespørgsel får indlæggene, og hvem der startede indlægget, kommentarer og hvem der postede kommentarerne. Denne indre forespørgsel er også forhåndssorteret med de SENESTE KOMMENTARER til toppen pr. post-ID. Ved at bruge resultatet af det slutter jeg mig til sql-variablerne (@variables) for at få @varRow forøget hver gang en ny kommentar og nulstillet tilbage til 1 hver gang et indlægs-id ændres (deraf de indre PreQuery-ordrer efter post-ID FIRST ). Til sidst, hvis du bruger HAVING-sætningen til at få kommentarens @varRow-antal <6, får du MEST 5 af hvert indlæg.

Hvis du vil begrænse, hvilke indlæg du forsøger at hente, ville jeg anvende en WHERE-klausul (såsom dato/klokkeslæt, hvis det er tilgængeligt) på det INDERSTE mest, der genererer "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 --- pr kommentarJeg TROR, hvad du mener med hvilket "forældreindlæg" kommentarerne er forbundet med, er fordi de har post-id'et direkte. Da den inderste forespørgsel samler alle elementer/tabeller over hele linjen, kommer alle med på turen...

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 er gjort og sorteret efter fælles post-id og den seneste kommentar sorteret til toppen, anvender jeg @vars mod ALLE returnerede rækker. HAVING-sætningen vil fjerne enhver kommentar, hvor dens rækkefølge er UDOVER de 5, du ledte efter.



  1. Omdiriger til startsiden efter login php

  2. Indstil tidszone i PHP og MySQL

  3. Opretter du tilpassede html-tags til CMS?

  4. Sådan bestiller du efter månedsnavn i PostgreSQL eller Oracle