sql >> Database >  >> RDS >> Mysql

Een limiet gebruiken voor een left join in mysql

Van de bewerkingen en feedback op opmerkingen, hier is de vraag waarvan ik denk dat u naar op zoek bent... De meest innerlijke prequery krijgt de berichten en wie de post heeft gestart, opmerkingen en wie de opmerkingen heeft geplaatst. Deze innerlijke vraag is ook voorgesorteerd met de MEEST RECENTE COMMENTAAR bovenaan per postID. Met behulp van het resultaat daarvan, doe ik mee aan de sql-variabelen (@variables) om de @varRow elke keer dat een nieuwe opmerking wordt toegevoegd te verhogen en elke keer dat een post-ID verandert weer terug te zetten naar 1 (vandaar de innerlijke PreQuery-bestellingen per post-ID FIRST ). Ten slotte zal het gebruik van de HAVING-clausule om het @varRow-aantal van de opmerking <6 te hebben, MEESTE 5 van elk bericht krijgen.

Als je wilt beperken welke berichten je probeert op te halen, zou ik maximaal een WHERE-clausule (zoals datum/tijd indien beschikbaar) toepassen die de "PreQuery" genereert.

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

--- BEWERK --- per reactie. IK DENK wat je bedoelt met welke "Ouderpost" de reacties zijn gekoppeld, omdat ze de post-ID rechtstreeks hebben. Aangezien de binnenste query een samenvoeging van alle elementen / tabellen over de hele linie doet, komen ze allemaal mee voor de rit...

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

Zodra DAT allemaal is gedaan en gesorteerd op algemene post-ID en meest recente opmerking bovenaan, pas ik de @vars toe op ALLE geretourneerde rijen. De HAVING-clausule verwijdert elke opmerking waarvan de volgorde BEYOND de 5 is waarnaar u op zoek was.



  1. SQL-query om geregistreerde gebruikers per dag te tellen

  2. Dynamische SQL om kolomnamen te genereren?

  3. Wat betekent het om 1 uit de tabel te selecteren?

  4. Verschil in MySQL JOIN versus LEFT JOIN