Saya punya comments
tabel, yang bisa disederhanakan menjadi ini:
comments
=======
id
user_id
text
parent_id
di mana parent_id
nullable, tetapi mungkin menjadi kunci untuk komentar orang tuanya.
Sekarang, bagaimana saya bisa select
semua keturunan dari komentar tertentu?
Komentar mungkin turun beberapa tingkat ...
sumber
Desain tabel ini adalah antipattern SQL "Naive trees" seperti yang dijelaskan oleh Bill Karwin (menatap dari slide 48 dalam presentasi SQL Antipatterns Strike Back ). Masalah dengan desain ini secara khusus adalah kesulitan untuk mendapatkan semua keturunan (atau orang tua) dari suatu simpul. Karena Anda menggunakan MySQL, Anda tidak dapat menggunakan ekspresi tabel umum (pernyataan WITH dan itu adalah pengubah RECURSIVE) yang ada di RDBMSes lain.
Yang tersisa adalah:
membangun kueri gabung sendiri dengan batas kedalaman. Untuk kedalaman = 5 Anda dapat menggunakan sesuatu di baris:
gunakan RDBMS yang mendukung WITH RECURSIVE (walaupun ini kemungkinan besar bukan pilihan bagi kebanyakan orang)
sumber
MySQL tidak mendukung permintaan rekursif seperti yang Anda butuhkan.
Apa yang saya lakukan beberapa waktu lalu adalah menulis Stored Procedures yang menyediakan model untuk melakukannya.
Daripada menemukan kembali roda, saya akan memberi Anda tautan ke pos lama saya tentang ini:
Oct 24, 2011
: Temukan level tertinggi dari bidang hierarkis: dengan vs tanpa CTEDec 10, 2012
: MySQL: Kueri Tree-HierarchicalApr 12, 2013
: Permintaan rekursif di mysqlSingkatnya, Stored Procedures yang saya buat melakukan preorder tree traversal menggunakan pemrosesan antrian
GetParentIDByID
GetAncestry
GetFamilyTree
Induk Semua Anak (seperti Prosedur Tersimpan GetFamilyTree)
parent_id
antrianparent_id
sebagai arusid
nilai yang ada saat iniparent_id
STEP02
Child to all Parent (seperti Prosedur yang Disimpan GetAncestry)
id
antrianid
sebagai arusparent_id
nilai arusid
STEP02
Silakan lihat Prosedur Tersimpan di posting saya yang lain untuk melihat implementasinya.
Cobalah !!!
sumber
biola
sumber