Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Korzystanie z limitu lewego sprzężenia w mysql

Z edycji i opinii o komentarzach, oto zapytanie, którego, jak sądzę, szukasz... Najbardziej wewnętrzne zapytanie wstępne pobiera posty i kto zainicjował post, komentarze i kto je opublikował. To wewnętrzne zapytanie jest również wstępnie posortowane z NAJNOWSZYMI KOMENTARZAMI na górze według identyfikatora postID. Korzystając z tego wyniku, łączę się ze zmiennymi sql (@zmienne), aby @varRow zwiększał się za każdym razem, gdy nowy komentarz i resetował do 1 za każdym razem, gdy zmienia się identyfikator postu (stąd wewnętrzne zamówienia PreQuery według identyfikatora postu PIERWSZE ). Na koniec, użycie klauzuli HAVING, aby liczba @varRow komentarza <6 osiągnęła MAKSYMALNIE 5 każdego posta.

Jeśli chcesz ograniczyć posty, które próbujesz pobrać, zastosuję klauzulę WHERE (taką jak data/godzina, jeśli jest dostępna) na najbardziej INNER, która generuje "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

--- EDYTUJ --- za komentarz MYŚLĘ, że masz na myśli to, z którym „postem nadrzędnym” są powiązane komentarze, ponieważ mają bezpośrednio identyfikator posta. Ponieważ najbardziej wewnętrzne zapytanie łączy wszystkie elementy / tabele na całej tablicy, wszystkie są gotowe do jazdy...

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

Kiedy to wszystko zostanie zrobione i posortowane według wspólnego identyfikatora posta i najnowszego komentarza posortowanego do góry, następnie zastosuję @vars do WSZYSTKICH zwróconych wierszy. Klauzula HAVING usunie każdy komentarz, którego sekwencja wykracza poza 5, których szukałeś.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Jak wybrać rekordy na ten tydzień?

  2. Jak wstawić chiński znak w tabeli mysql?

  3. Jak automatycznie zalogować się w MySQL ze skryptu powłoki?

  4. Czy można automatycznie utworzyć plik mysqldump, który nie wymusza ograniczeń klucza obcego?

  5. Jak uzyskać wszystkie wartości w kolumnie za pomocą PHP?