Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Mengambil Secara Rekursif Semua Keturunan dalam Struktur Pokok MySQL?

Bagaimana untuk Mengambil Secara Rekursif Semua Keturunan dalam Struktur Pokok MySQL?

DDD
DDDasal
2024-10-23 19:45:30509semak imbas

How to Recursively Retrieve All Descendants in a MySQL Tree Structure?

Mengulangi Struktur Pokok dalam MySQL

Mengurus data hierarki dalam pangkalan data boleh menjadi satu cabaran. Satu pendekatan biasa melibatkan penggunaan hubungan ibu bapa-anak, seperti yang ditunjukkan dalam soalan yang disediakan. Walaupun membuat pertanyaan untuk keturunan terdekat adalah mudah, mendapatkan semula semua keturunan boleh menjadi lebih kompleks.

Dokumentasi MySQL mencadangkan beberapa kaedah untuk mengendalikan data hierarki, termasuk yang berikut:

  • Laluan Penghitungan: Kaedah ini melibatkan penyimpanan laluan dari setiap nod ke akar pokok dalam lajur pangkalan data. Pertanyaan kemudiannya boleh menggunakan lajur ini untuk mendapatkan semula keturunan yang cekap.
  • Senarai Bersebelahan: Pendekatan ini menyimpan perhubungan induk-anak dalam satu jadual, dengan setiap baris mewakili nod dan induk langsungnya. Walaupun mudah untuk dilaksanakan, ia memerlukan berbilang pertanyaan untuk mendapatkan semula semua keturunan.
  • Set Bersarang: Kaedah yang lebih maju ini menggunakan sepasang lajur untuk menyimpan kedudukan kiri dan kanan setiap nod dalam pokok. Ia menawarkan perolehan turunan yang cekap tetapi memerlukan kemas kini jadual yang lebih kompleks.

Untuk contoh yang diberikan, menggunakan kaedah Penghitungan Laluan, pertanyaan berikut akan mendapatkan semula semua keturunan lokasi induk:

WITH RECURSIVE descendant_path AS (
  SELECT id, path
  FROM locations
  WHERE id IN (SELECT location_id FROM location_parent WHERE parent_id = '$locationid')
  UNION ALL
  SELECT l.id, CONCAT(dp.path, ',', l.id)
  FROM locations l
  JOIN descendant_path dp ON l.path LIKE CONCAT(dp.path, '%')
)
SELECT id FROM descendant_path;

Pertanyaan ini menggunakan CTE rekursif (Ungkapan Jadual Biasa) untuk melelaran melalui struktur pokok dan membina laluan untuk setiap lokasi keturunan. Dengan menyatakan lokasi permulaan dalam pertanyaan awal, semua keturunan boleh diambil dalam satu laluan.

Atas ialah kandungan terperinci Bagaimana untuk Mengambil Secara Rekursif Semua Keturunan dalam Struktur Pokok MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn