Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Melintasi Struktur Pokok secara Rekursif dalam MySQL?

Bagaimana untuk Melintasi Struktur Pokok secara Rekursif dalam MySQL?

Barbara Streisand
Barbara Streisandasal
2024-10-24 04:59:02241semak imbas

How to Recursively Traverse a Tree Structure in MySQL?

Mengulangi Struktur Pokok dalam MySQL

Apabila bekerja dengan data hierarki, selalunya perlu untuk mendapatkan semula keturunan nod tertentu dalam pepohon struktur. Dalam konteks MySQL, di mana lokasi boleh berada di dalam lokasi lain, tugasan menjadi lebih kompleks apabila bilangan tahap meningkat.

Pertanyaan PHP/MySQL yang disediakan:

$sql = "SELECT id FROM se_locations_services WHERE parent_locationid IN
( SELECT location_id FROM se_locations_parent WHERE parent_id = '$locationid' )";

dengan berkesan mendapatkan semula keturunan terdekat dari lokasi tertentu.

Walau bagaimanapun, untuk mendapatkan semula semua keturunan, tanpa mengira kedalaman, pendekatan rekursif diperlukan. MySQL tidak menyokong pertanyaan rekursif secara asli, tetapi terdapat penyelesaian elegan yang digariskan dalam artikel komprehensif yang dipautkan di bawah dari mysql.com:

[Mengurus Data Hierarki dalam MySQL](https://www.mysql.com/news -and-events/mysql-perspectives/performance-tuning-json-mysql-for-hierarchical-data/)

Artikel ini membentangkan pelbagai pendekatan untuk mengendalikan data hierarki, termasuk pilihan menggunakan CTE (Umum Ungkapan Jadual) untuk melaksanakan rekursi:

WITH RECURSIVE descendants (id, parent_id) AS (
    SELECT id, parent_id FROM locations
    UNION ALL
    SELECT l.id, l.parent_id FROM locations l
    JOIN descendants d ON l.parent_id = d.id
)
SELECT DISTINCT id FROM descendants WHERE parent_id = $locationid;

Dengan menggunakan operator UNION ALL, CTE secara lelaran mengembangkan senarai keturunan, membenarkan MySQL mendapatkan semula hierarki penuh daripada satu pertanyaan.

Atas ialah kandungan terperinci Bagaimana untuk Melintasi Struktur Pokok secara Rekursif dalam 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