2011-11-12 16 views
11

Próbuję znaleźć wszystkich rodziców, dziadków itp. Danego pola z dowolną głębią. Na przykład, biorąc pod uwagę poniższą strukturę, jeśli mogę dostarczyć 5, wartości zwracane powinny być 1, 2, 3 i 4.Hierarchiczne zapytania w MySQL

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

Jak to zrobić?

+2

Musisz zmienić schemat tego. Przeczytaj prezentację [@BillKarwin] (http://stackoverflow.com/users/20860/bill-karwin) zatytułowaną [Modele danych hierarchicznych z SQL i PHP] (http://www.slideshare.net/billkarwin/models -for-hierarchiczne-dane), w różnych modelach i sposobie ich implementacji. – Shef

+0

@Shef: Jakie zmiany należy wprowadzić w schemacie i jak napisać zapytanie. –

+0

@BillKarwin: W twoim ppt, wspomniałeś, że powyższej logiki nie można zrobić za pomocą mysql. Czy tak jest? –

Odpowiedz

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 ... może być niebezpieczne, jeśli używasz go za dużo, jak na dużej stronie? – Wiliam

+2

@Wiliam: nie jest to bezpieczne z powodu aktualizacji, ponieważ 'MySQL' nie definiuje jednoznacznie zachowania zmiennej sesji. Jest to jednak jedyny sposób na radzenie sobie z listami sąsiedzkimi w odpowiednim czasie. – Quassnoi

+0

Tylko w celach informacyjnych (jako "niebezpieczne" może oznaczać cokolwiek), czy ktoś może się zastanowić, co jest niebezpieczne? Co spowodowałoby/nie byłoby niebezpieczne? – Mike

-7

Poniższa odpowiedź nie jest tylko MYSQL, ale używa PHP. Ta odpowiedź może być przydatna dla wszystkich osób, które znajdą się na tej stronie podczas wyszukiwania (tak jak ja), ale nie są ograniczone do używania tylko MYSQL.

Jeśli masz bazę danych z zagnieżdżonej strukturze nieznanej głębokości, można wydrukować zawartość za pomocą pętli rekurencyjnej:

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

Funkcja ta może być również zapisane w jakimkolwiek innym języku, takich jak JavaScript.

Powiązane problemy