Pertanyaan Kueri MySQL untuk menyortir komentar dan balasan bersarang mereka


Saya telah membaca lebih dari 10 posting terkait di sini dan di tempat lain dan masih tidak bisa mengetahui yang satu ini, yang agak baru untuk php dan MySQL:

Saya menggunakan WordPress dan mencoba menerapkan komentar bertingkat dalam tema lama. Meja saya sudah siap (sebut saja 'komentar') dan memiliki bidang-bidang berikut:

comment_ID | comment_date | comment_parent, etc.

comment_parent sisa sama dengan 0 di komentar tingkat atas; itu sama dengan comment_ID dari komentar yang dibalas dalam balasan yang disarangkan.

Query MySQL asli terlihat seperti ini:

SELECT * FROM $wpdb->comments 
WHERE comment_post_ID = %d AND comment_approved = '1' 
ORDER BY comment_date ASC LIMIT %d"

Melalui php yang mengikuti dan mengeluarkan daftar komentar, komentar didaftar berdasarkan tanggal tanpa menghormati balasan bersarang seperti itu:

comment_ID | comment_date | comment_parent
100          Jan 01         0      (this is a top level comment)
104          Jan 03         0      (this is a top level comment)
106          Jan 04         100    (this is a reply to the first comment)
108          Jan 05         104    (this is a reply to the second comment)

Jelas, urutannya rusak karena saya menyortir berdasarkan tanggal. Komentar 106 akan muncul tepat di bawah komentar 100, dan komentar 108 harus di bawah komentar 104.

Saya mencoba untuk tidak mengubah php saya dan saya ingin melakukan ini dengan query MySQL tetapi tidak bisa melakukannya dengan benar. Saya telah mencoba menggunakan JOIN, GROUP BY, HAVING seperti yang disarankan dalam pertanyaan serupa, tanpa keberhasilan apa pun. Apakah ada cara bagi saya untuk mencapai penyortiran yang benar langsung dari kueri dan menjaga php saya tetap utuh?


4
2018-05-03 18:56


asal


Jawaban:


Yah, saya akhirnya menemukan jawabannya, sebagian berkat komentar Nupul di atas yang mengatakan bahwa: "Anda dapat mengambil semua komentar tingkat teratas sekaligus dan kemudian komentar yang disarangkan (semua) di babak kedua dan mengisi konten Anda sesuai dengan itu. ". Saya memang mencoba opsi itu tidak berhasil, tetapi ini memotivasi saya untuk bertahan ...

Sebagai catatan dan berharap ini dapat membantu seseorang di masa depan, inilah cara saya memperbaikinya. Dua query MySQL terpisah mengambil dulu komentar tingkat atas dan kedua, itu komentar balasan bersarang (pertanyaan ini diformat untuk WordPress.)

$comments = $wpdb->get_results($wpdb->prepare("
  SELECT * 
  FROM $wpdb->comments 
  WHERE comment_post_ID = %d AND comment_approved = '1' AND comment_parent = '0' 
  ORDER BY comment_date ASC 
  LIMIT %d
",etc,etc)); 

$replies = $wpdb->get_results($wpdb->prepare("
  SELECT * 
  FROM $wpdb->comments 
  WHERE comment_post_ID = %d AND comment_approved = '1' AND comment_parent <> '0' 
  ORDER BY comment_date ASC 
  LIMIT %d
",etc,etc));

Lalu aku pergi ke loop komentar utama saya (FOREACH) mencari komentar tingkat atas hanya. Dalam lingkaran itu, di bagian bawah, saya melompat ke loop IF bertingkat untuk mencari komentar bertumpuk di mana

$ reply-> comment_parent == $ comment-> comment_ID (membandingkan 2 kueri MySQL saya)

dan jika benar menyesuaikan $ komentar menyamai $ balasan sehingga komentar bersarang saya digemakan dengan benar oleh WordPress. Saya kemudian mengembalikan nilainya $ komentar ke aslinya dan keluar dari loop komentar bersarang saya kembali ke FOREACH utama.

Mungkin ada kekurangan dalam penalaran atau eksekusi saya tetapi itu berfungsi seperti pesona! Tentu saja ini tidak memberikan tingkat tambahan dan semua komentar bertingkat ditulis satu demi satu bahkan jika mereka saling membalas satu sama lain, tapi itu cukup baik untuk saya!

Untuk demo, http://www.vincentmounier.com/blog2/ dan klik pada tautan "Tampilkan Komentar" di bagian bawah pos. Nupul, terima kasih sekali lagi untuk motivasi!


4
2018-05-04 04:13



Anda mungkin lebih baik mengubah desain meja Anda. Salah satu cara terbaik untuk menerapkan komentar bertingkat adalah dengan Modified Preorder Tree Traversal (MPTT)

Ini adalah artikel tentang menu MPTT, tetapi Anda harus dapat mempelajari cara menerapkan sistem komentar menggunakan skema yang sama.


3
2018-05-03 19:05