2011-11-12 15 views
11

Herhangi bir derinliğe sahip belirli bir alanın tüm ebeveynleri, büyükanne ve büyükbabalarını bulmaya çalışıyorum. Örneğin, aşağıda yapıya verilen Ben 5 sağlarsanız, değerler 1, 2, 3 ve bunu yapacağımı nasıl 4.Hiyerarşik sorgulamalar MySQL

| a | b | 
----------- 
| 1 | 2 | 
| 2 | 3 | 
| 3 | 4 | 
| 4 | 5 | 
| 3 | 6 | 
| 4 | 7 | 

olmalıdır döndü?

+2

Bunun için şemayı değiştirmelisiniz. [@BillKarwin] başlıklı sunumu [http://stackoverflow.com/users/20860/bill-karwin) [SQL ve PHP ile Hiyerarşik Veri Modelleri] başlıklı sunumu (http://www.slideshare.net/billkarwin/models) Hiyerarşik-veri), farklı modellerde ve bunların nasıl uygulanacağı. – Shef

+0

@Shef: Şemada hangi değişiklikleri yapmalıyım ve sorguyu nasıl yazarım. –

+0

@BillKarwin: Sizin pptinizde, yukarıdaki mantığın mysql kullanılarak yapılamayacağını belirttiniz. –

cevap

22
SELECT @id := 
     (
     SELECT senderid 
     FROM mytable 
     WHERE receiverid = @id 
     ) AS person 
FROM (
     SELECT @id := 5 
     ) vars 
STRAIGHT_JOIN 
     mytable 
WHERE @id IS NOT NULL 
+1

waw ... büyük bir web sitesinde olduğu gibi çok fazla kullanırsanız tehlikeli olabilir. – Wiliam

+2

@Wiliam: "MySQL", oturum değişken davranışını açık bir şekilde tanımladığından, yükseltme güvenli değil. Ancak, bitişik listelerle sorgudaki zamanında ilgilenmenin tek yolu budur. – Quassnoi

+0

Sadece referans için ("tehlikeli" herhangi bir şeyle ilgili olabilir), birisinin bu konuda tehlikeli olabileceğini düşünüyor mu? Ve bunun tehlikeli olmasına/olmasına neden olmaz? – Mike

-7

Aşağıdaki yanıt yalnızca MYSQL değildir, ancak PHP kullanır. Bu cevap, arama sırasında bu sayfada yer alan herkes için yararlı olabilir (benim yaptığım gibi) ancak sadece MYSQL'i kullanmayla sınırlı değildir.

bilinmeyen bir derinlik iç içe yapısıyla bir veritabanı varsa, bir özyinelemeli döngü kullanarak içeriğini yazdırabilirsiniz:

function goDownALevel($parent){ 
    $children = $parent->getChildren(); //underlying SQL function 
    if($children != null){ 
      foreach($children as $child){ 
       //Print the child content here 
       goDownALevel($child); 
      } 
    } 
} 

Bu fonksiyon da JavaScript gibi başka bir dilde yeniden yazılabilir.