![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
Postanowiłem pobawić się omawianym już kilkakrotnie systemem tworzenia drzew w bazie (np. http://forum.php.pl/viewtopic.php?t=2625 i http://www.depesz.pl/various-sqltrees.php - 5 sposóB) przy pomocy MySQL.
Początkowo wszystko było ok. Dodawanie pozycji - banalne. Przeglądanie - w te i we wte - również. Jednak trafiłem na problem. Zastanawiam się, jak efektownie usuwać gałęzie. Oczywiście można pobrać dane wszystkich potomków, i w pętli, lub przy pomocy IN usunąć je. Jednak wszyscy mówili, że można to zrobić za pomocą pojedynczych zapytań. No i mam problem (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) Wymyśliłem takie zapytanie Cytat DELETE FROM powiazania
USING powiazania AS p LEFT JOIN powiazania as p2 ON ( p.first_id = p2.second_id ) WHERE p2.first_id = 1 jednak nie działa ono do końca poprawnie, gdyz za szybko usuwa sobie niektóre wiersze, i doprowadza to do tego, że niektóre pozostają. Nie mam również żadnego pomysłu, jak zmontować przenoszenie gałęzi (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) Struktura bazy i przykładowe dane :arrow: http://mstudio.nq.pl/php_pl/inne/test_drzewko.sql |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
Tutaj o kasowaniu gałęzi. Po prostu kasujesz wszystko co ma w first_id id kasownej gałęzi!
Mam taką wizje co do przenoszenia gałęzi (ten typ struktury drzewiastej jest chyba najlepszy, aczkolwiek znam pare łatwiejszych, ale mniej wydajnych, gdzie można to zrobić łatwiej). Kasujesz wszystkie powiązania gałęzi z elementami zewnętrznymi (nie zawierającymi się w gałęzi). Zmieniasz w powiązaniach id rodzica (first_id?) dla przenoszonej gałęzi (tylko dla tego katalogu, i nizcego więcej). Tworzysz powiązania dla wyżej wymienionego katalogu (gałęzi). Teraz robisz taką sztuczke, dla każdego elementu gałęzi robisz powiązanie w postaci: Sprawdzasz zagłebienie całej gałęzi (przenoszonej) względem każdego elemntu (zewnętrznego), do którego powiązania ma gałąź (wcześniej robiłeś powiązania dla gałęzi). Sprawdzasz zagłębienie elemntu (wewnątrz gałęzi), dla którego aktualnie robisz powiązanie względem całej gałęzi (tego nie należy kasować, gdyż to się nie zmienia). Dodajesz powiąznie, gdzie depth to suma dwóch powyższych liczb. I tak dla każdego elementu! Jest to może nizbyt wydajne, ale wydaje mi się przy małej pomocy php całkiem proste do zaimplementowania, a poza tym, w końcu gałęzie przenosie się dość żadko! |
|
|
![]() ![]() |
![]() |
Aktualny czas: 12.10.2025 - 22:33 |