Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Nested Sets - przenoszenie węzłów i liści góra/dół
grz16w
post
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)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
wiewiorek
post
Post #2





Grupa: Zarejestrowani
Postów: 247
Pomógł: 11
Dołączył: 5.09.2009

Ostrzeżenie: (0%)
-----


Joshima napisal: "@Crozin naucz się wreszcie tego, no nie trudne a może przestaniesz straszyć ludzi. / Pisałeś, że to wyjątkowo trudne a ja twierdzę, że bułka z masłem. "

Uwielbiam takich ludzi jak Joshima - mowia, ze cos jest latwe ale kodu nie podadza - jak to mowi moja babcie "g*** widzieli, g*** umieja" (IMG:style_emoticons/default/tongue.gif)

Nested set z pewnością są SKOMPLIKOWANE !

grz16w więc co tam chciałeś ? przenoszenie gałęzi - więc to będzie tak:
zakładając, że mamy tabelę nested_category z kolumnami:
category_id
name
lft
rgt


Kod do przenoszenia poddrzewa:
  1. --przenoszenie poddrzewa np. z category_id = 2 i podczepienie go do np. category_id = 6:
  2. START TRANSACTION;
  3.  
  4. --jesli przenoszone poddrzewo ma trafic na poczatek:
  5. --SELECT @destination := (lft + 1) FROM nested_category WHERE category_id = 6;
  6. --jesli przenoszone poddrzewo ma trafic na koniec:
  7. SELECT @destination := rgt FROM nested_category WHERE category_id = 6;
  8. SELECT @cat_a_width := ((rgt - lft) + 1) FROM nested_category WHERE category_id = 2;
  9.  
  10. UPDATE nested_category SET rgt = rgt + @cat_a_width WHERE rgt >= @destination;
  11. UPDATE nested_category SET lft = lft + @cat_a_width WHERE lft >= @destination;
  12.  
  13. SELECT @cat_a_lft := lft, @cat_a_rgt := rgt FROM nested_category WHERE category_id = 2;
  14. SELECT @diff := @destination - @cat_a_lft;
  15.  
  16. UPDATE nested_category SET rgt = rgt + @diff WHERE rgt BETWEEN @cat_a_lft AND @cat_a_rgt;
  17. UPDATE nested_category SET lft = lft + @diff WHERE lft BETWEEN @cat_a_lft AND @cat_a_rgt;
  18.  
  19. UPDATE nested_category SET rgt = rgt - @cat_a_width WHERE rgt >= @cat_a_lft;
  20. UPDATE nested_category SET lft = lft - @cat_a_width WHERE lft >= @cat_a_lft;
  21.  
  22. COMMIT;



Glebokosc elementow drzewa daje:
  1. SELECT node.name, (COUNT(parent.category_id) - 1) AS depth
  2. FROM nested_category AS node,
  3. nested_category AS parent
  4. WHERE node.lft BETWEEN parent.lft AND parent.rgt
  5. GROUP BY node.category_id
  6. ORDER BY node.lft;



Ale tak jak mowil Crozin - ZDECYDOWANIE daj kolumne depth i parent_id - zobaczysz ze to w wielu sytuacjach ulatwi zapytania. A i jeszcze dodam, ze sam zawsze sie waham czy uzywac nested set czy adjacency list, ale mysle ze warto wziac pod uwage, ze w wiekszosci wypadkow uzywana bywa adjacency list czyli sposob z sama kolumna parent_id i nie wplywa to w zauwazalny sposob na czas oczekiwania na wyswietlenie strony - jesli rekordow jest bardzo duzo to wowczas stosuje sie cachowanie.

Ten post edytował wiewiorek 12.04.2011, 08:03:59
Go to the top of the page
+Quote Post

Posty w temacie
- grz16w   Nested Sets - przenoszenie węzłów i liści góra/dół   10.04.2011, 22:42:12
- - Crozin   Zanim zapomnę: o ile dobrze pamiętam phpBB3 albo j...   10.04.2011, 23:13:45
- - 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


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 27.12.2025 - 18:07