Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menggunakan batas pada gabungan kiri di mysql

Dari suntingan dan umpan balik komentar, inilah kueri yang menurut saya Anda cari... Prequery paling dalam akan mendapatkan postingan dan siapa yang memprakarsai postingan, komentar, dan siapa yang memposting komentar. Kueri dalam ini juga telah diurutkan sebelumnya dengan KOMENTAR TERBARU ke atas per postID. Dengan menggunakan hasil itu, saya bergabung dengan variabel sql (@variables) untuk mendapatkan @varRow meningkat setiap kali komentar baru dan mengatur ulang kembali ke 1 setiap kali ID pos berubah (karenanya PreQuery bagian dalam memesan dengan ID pos PERTAMA ). Terakhir, menggunakan klausa HAVING untuk membuat komentar @varRow count <6 akan mendapatkan PALING 5 dari setiap posting.

Jika Anda ingin membatasi posting apa yang Anda coba ambil, saya akan menerapkan klausa WHERE (seperti tanggal/waktu jika tersedia) di INNER paling banyak yang menghasilkan "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 komentarSaya BERPIKIR apa yang Anda maksud dengan "Posting Induk" yang terkait dengan komentar adalah karena mereka memiliki ID posting secara langsung. Karena kueri paling dalam melakukan penggabungan semua elemen / tabel di seluruh papan, semua ikut serta...

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

Setelah ITU semua selesai dan diurutkan berdasarkan ID Postingan umum dan komentar terbaru diurutkan ke atas, saya kemudian menerapkan @vars terhadap SEMUA baris yang dikembalikan. Klausa HAVING akan menghapus komentar yang urutannya LUAR 5 yang Anda cari.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO:Server MySQL telah hilang

  2. Apakah menggunakan LIMIT 1 mempercepat kueri pada kunci utama?

  3. Bagaimana saya bisa memanggil prosedur tersimpan di server MySQL Ubuntu jarak jauh?

  4. Strongloop:memfilter data dengan kondisi [dan] dan [atau] secara bersamaan

  5. masalah menginstal mysql python, modul mysqldb tidak ditemukan di Django