Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 14.07.2009 Skąd: Rzeszów Ostrzeżenie: (0%)
|
Witam.
Czy ktoś wie lub posiada przykład działającej poprawnie funkcji przesuwania liści i węzłów w strukturze Nested Sets wewnątrz jednej gałęzi (rodzica)? Mam tabelę posiadającą kolumny `id`, `nazwa`, `lft`, `rgt`, `parent`. W jaki sposób zamienić miejscami dwa węzły lub liście wewnątrz tego samego rodzica (uwzględniając, że te węzły mogą posiadać również swoje dzieci itd.)? Z góry dziękuję serdecznie za odpowiedzi (IMG:style_emoticons/default/smile.gif) |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%)
|
Zanim zapomnę: o ile dobrze pamiętam phpBB3 albo jakiś inny PHP-owski skrypt forum ma drzewo kategorii oparte o ten właśnie model i jest tam kod do przenoszenia - możesz podejrzeć.
Ogólnie to jest to trochę... zamotane. Bo trzeba zmieniać klucze LFT i RGT w połowie drzewa przy próbie przeniesienia jakiegoś węzła. Sprawy nie ułatwia fakt, że właściwie każdy rodzaj czy nawet wariant operacji wymaga nieco innego podejścia. Przede wszystkim musisz wyliczyć deltę, czyli fragment drzewa który przenosisz (różnica RGT i LFT). Następnie musisz pomniejszyć indeksy LFT / RGT wszystkich elementów występujących po przenoszonej gałęzi właśnie o wartość delty. Teraz drzewo ponownie jest spójne - nie ma żadnych "dziur". Kolejny krok to zrobienie miejsca na przenoszoną gałąź. Musisz indeksy LFT / RGT wszystkich elementów które będą miały występować po wklejanym elemencie zwiększyć o wartość delty. Ostatni krok to zmienienie indeksów LFT / RGT przenoszonej gałęzi tak by pasowały do swojej nowej lokacji. I jeszcze kilka rad: 1. W przypadku nested set warto również przechowywać w bazie informacje o poziomie zagłębienia konkretnego elementu - bardzo ułatwia to wiele operacji. 2. Całość obejmij transakcją. 3. Mimo iż da się to skrócić czasami do mniejszej ilości ale bardziej skomplikowanych zapytań nie rób tego. 10 prostych UPDATE-ów jest po stokroć lepsze niż 2 skomplikowane, pełne CASE-ów i innych paskudnych konstrukcji. |
|
|
|
grz16w Nested Sets - przenoszenie węzłów i liści góra/dół 10.04.2011, 22:42:12
jang http://www.phpriot.com/articles/nested-trees-2/7
... 11.04.2011, 08:18:26
JoShiMa Cytat(grz16w @ 10.04.2011, 22:42:12 )... 11.04.2011, 10:24:51 
grz16w Cytat(JoShiMa @ 11.04.2011, 11:24:51 ... 11.04.2011, 15:13:30 
JoShiMa Cytat(grz16w @ 11.04.2011, 15:13:30 )... 11.04.2011, 21:38:11 
grz16w Cytat(JoShiMa @ 11.04.2011, 22:38:11 ... 11.04.2011, 22:02:31 
JoShiMa Cytat(grz16w @ 11.04.2011, 22:02:31 )... 11.04.2011, 22:37:33
Crozin Można ale jest to dosyć skomplikowane, a trzymanie... 11.04.2011, 22:08:23
Crozin @JoShiMa: Szkoda tylko, że nie dodałeś że dynamicz... 11.04.2011, 22:59:11 
JoShiMa Cytat(Crozin @ 11.04.2011, 22:59:11 )... 11.04.2011, 23:08:01
Crozin CytatLub podzapytania. I nie odwracaj kota ogonem.... 11.04.2011, 23:32:32 
JoShiMa Cytat(Crozin @ 11.04.2011, 23:32:32 )... 11.04.2011, 23:38:53
wiewiorek Joshima napisal: "@Crozin naucz się wreszcie ... 12.04.2011, 07:55:05 
JoShiMa Cytat(wiewiorek @ 12.04.2011, 07:55:0... 12.04.2011, 09:24:17
grz16w Więc tak.. Użyłem metody:
CytatSELECT node.name, ... 12.04.2011, 10:39:37
JoShiMa A to zapytanie wywołujesz w bazie czy w skrypcie P... 12.04.2011, 11:03:46
grz16w Wykonuję to zapytanie przez PHP. Gdy wykonuję w pa... 12.04.2011, 11:27:00 
JoShiMa Cytat(grz16w @ 12.04.2011, 11:27:00 )... 12.04.2011, 21:52:17
Crozin CytatCytatTo podzapytanie to o ile się nie mylę (j... 12.04.2011, 16:53:32
Crozin Nic nie oszukuję. Przecież przy przenoszeniu i tak... 12.04.2011, 21:55:07 ![]() ![]() |
|
Aktualny czas: 26.12.2025 - 13:33 |