Mysql
 sql >> база данни >  >> RDS >> Mysql

Използване на ограничение за ляво присъединяване в mysql

От редакциите и обратната връзка с коментарите, ето заявката, която мисля, че търсите... Най-вътрешната предварителна заявка получава публикациите и кой е инициирал публикацията, коментира и кой е публикувал коментарите. Тази вътрешна заявка също е предварително сортирана с НАЙ-ПОСЛЕДНИТЕ КОМЕНТАРИ в горната част на идентификатор на публикация. Използвайки резултата от това, се присъединявам към sql променливите (@variables), за да увеличавам @varRow всеки път, когато има нов коментар и да връщам обратно на 1 всеки път, когато идентификаторът на публикацията се промени (следователно вътрешните поръчки на PreQuery по ID на публикация ПЪРВО ). И накрая, ако използвате клаузата HAVING, за да имате @varRow count <6 на коментара, ще получите НАЙ-много 5 от всяка публикация.

Ако искате да ограничите публикациите, които се опитвате да извлечете, бих приложил клауза WHERE (като дата/час, ако е налична) най-много INNER, която генерира "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

--- РЕДАКТИРАНЕ --- на коментар МИСЛЯ, че това, което имате предвид с коя "родителска публикация" са свързани коментарите, е защото имат директно идентификатора на публикацията. Тъй като най-вътрешната заявка обединява всички елементи/таблици в цялата дъска, всички идват заедно...

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

След като всичко това е направено и сортирано по общ идентификатор на публикация и най-скорошен коментар, сортиран в горната част, аз прилагам @vars срещу ВСИЧКИ върнати редове. Клаузата HAVING ще премахне всеки коментар, където неговата последователност е НАВЪВ 5-те, които търсите.



  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 - ПОРЪЧАЙТЕ ПО стойности в рамките на IN()

  2. MySql:ако съществува стойност UPDATE else INSERT

  3. Как да подобрим ефективността на заявката с подреждане по, групиране по и присъединяване

  4. Как да експортирате милиони редове от MySQL в CSV чрез PHP, без да изчерпвате паметта?

  5. Извадете месец и ден mysql