Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: procedura wyciągająca strukturę drzewiastą
Forum PHP.pl > Forum > Bazy danych > MySQL
tomek_
Witam 

mam takie dwie tabelki w bazie

Kod
groups

   id  INT PK      

   groupname VARCHAR

inheritance_group

   group_id    INT // id grupy     

   inherit_id  INT  //  id grupy którą dana grupa dziedziczy


 w innych tabelkach przechowuję uprawnienia dla kazdej z gróp (ale w tej chweili to nieistotne) 

 przykładowe dane w tych tabelkach to 

Kod
groups:

1 grupa1

2 grupa2 

3 grupa3

4 grupa4

itd

a w inheritance_group

3  1

3  2

4  3


czyli każda grupa może dziedziczyć dowolną ilość grup z których każde może także dziedziczyć ich dowolną ilość

potrzebuje teraz napisać procedurę składowaną która wyciągnie mi wszystkie grupy z których dziedziczy grupa podana w parametrze wejściowym (zarówno te bezpośrednio dziedziczone jak i te wyżej w hierarchii
próbowałem już na kilka sposobów ale jakoś nie mogę sobie z tym poradzić. 

potrafię to zrobić za pomocą php-a i procedury wyciągającej tylko te z których bezpośrednio dziedzczy dana grupa ale wolałbym wyciągać to jedną procedurą 

da się to w ogóle osiągnąć za pomocą jednej procedury sql? 
osiris
http://www.artfulsoftware.com/mysqlbook/sa...sqled1ch20.html
Listing 7c: Recursive edge list subtree in MySQL
tomek_
dzięki - wprawdzie jeszcze nie próbowałem tego zastosować ale wygląda na to że o coś takieg mi chodziło smile.gif 







na podstawie tego linka udało mi się napisac odpowiednią procedurę ale pojawił sie problem gdy próbuję ją wywołać.



pojawia mi się taki komunikat

Kod
#1436 - Thread stack overrun:  35600 bytes used of a 131072 byte stack, and 96000 bytes needed.  Use 'mysqld -O thread_stack=#' to specify a bigger stack. 




no to zwiększyłem wartość  thread_stack z 128 do 256 k 

po czym jak wywołuję ponownie procedurę mam 

Kod
#1456 - Recursive limit 25 (as set by the max_sp_recursion_depth variable) was exceeded for routine test 


jak zwiększę max_sp_recursion_depth to znowu wywaa komunikat o za małej wartości thread_stack

Kod
#1436 - Thread stack overrun:  168656 bytes used of a 262144 byte stack, and 96000 bytes needed.  Use 'mysqld -O thread_stack=#' to specify a bigger stack. 


ma ktoś jakiś pomysł jak to rozwiązać - od jakich jeszcze zmiennych to może zależeć ?
osiris
obstawialbym to ze Twoja struktura grup z powodu jakiegos bledu we wprowadzonych danych tworzy cykle, przez co przekraczany jest limit wywolan rekruencyjnych, albo wyczerpuje sie pamiec stosu dla procedur
tomek_
no rzeczywiście miałem błąd w jednym z zapytań przez co cały czas się wywoływała z tymi samymi parametrami - na szczęscie udało się zlokalizowac problem i już wszystko działa jak należy smile.gif 

dzięki za pomoc 
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.