2010-07-18 20 views
9

aşağıdaki tablo vardır: ben artık hiçbir parentId kurulana kadar geri izleme tüm satırları almak istiyorumözyinelemeli öz sorgu

myTable: 
+----+----------+ 
| id | parentID | 
+----+----------+ 
| 1 |  null | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  2 | 
| 5 |  4 | 
----------------- 

. beni verecekti Yani " id = 5" ....: Sen adjacency list model kullanarak hiyerarşik verileri organize edilmektedir

5, 4, 2, 1 
+4

Düzenli Fatura Karwin, fiziki verilere ve farklı çözümlerin nasıl kullanılacağına dair güzel bir açıklama hazırladı: http://www.slideshare.net/billkarwin/models-for-hierarchical-data – Wrikken

+0

MySQL, bu nedenle tekrarlamalı CTE'lere sahip değil. Eğer keyfi bir derinliği ele almanız gerekiyorsa, bu bir imleci gerektirir. Http://dev.mysql.com/tech-resources/articles/hierarchical-data.html bir seçenek yapısı değiştiriliyor mu? Ya da azami derinliği varsayabilir miyiz? Ayrıca bu konuyla ilgili http://stackoverflow.com/questions/169817/is-it-possible-to-query-a-tree-structure-table-in-mysql-in-a-single-query-to-any adresine bakın. –

+0

Bill Karwin'in slaytları gerçekten harika. – iddqd

cevap

9

. Bu özyinelemeli operasyonların zor olması, aslında bu modelin önemli bir dezavantajıdır.

SQL Server 2005, Postgres 8.4 ve Oracle 11g gibi bazı DBMS'ler, common table expressions'u kullanarak WITH anahtar sözcüğünü kullanarak yinelemeli sorguları destekler.

: MySQL gelince

, sen özyinelemeli işlemleri daha kolay (olası) kılan alternatif bir modeli ( nested set model) açıklar aşağıdaki makaleye, kontrol ilginizi çekebilir Ayrıca, yukarıdaki yorumlarda işaret edilen Bill Karwin's presentation'u da kontrol etmenizi öneriyorum. Açıklanan kapatma tablosu modeli, yuvalanmış kümeye çok geçerli bir alternatiftir.

+0

tamam, bağlantılar ve yorumlar için çok teşekkürler, şimdi anladım. Ağaçların çok derine inmesini beklemediğimden ve buna nadiren ihtiyacım olduğu için, sadece iki kendiliğinden birleşmeye karar verdim ve ebeveyn kimliği hala NULL DEĞİL ise sorguyu tekrar çalıştırıyorum. – iddqd

+0

@iddqd: Evet, bu yapılabilir. Fakat gördüğünüz gibi, bu modelin sınırlaması budur. –

+0

kesinlikle, thx. – iddqd