Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Drzewo z MySQL metodą trawersji.
sanneo
post
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 15.01.2008
Skąd: Warszawa

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


Witam wszystkich

Przeczytałem pewien artykuł http://www.sitepoint.com/article/hierarchical-data-database

Niestety nie opisuje jak poradzić sobie z typową sytuacją wielopoziomowego menu w serwisie.

Mam dane w takim formacie:

-message1
--message11
--message12
-message2
--message21
--message22
---message221
---message222
----message2221
----message2222
-----message22221
-----message22222
----message2223
---message223
-message3
--message31
---message311
---message312
---message313
--message32
-message4
--message41
--message42
-message5
--message51
--message52

Chciałbym wyświetlić tylko to:

-message1
-message2
--message21
--message22
---message221
---message222
----message2221
----message2222
-----message22221
-----message22222
----message2223
---message223
-message3
-message4
-message5

Dlatego, że wybrałem pozycję menu:

-----message22221

Macie jakiś pomysł jak to osiągnąć korzystając ze struktury bazy danych opisanej w artykule?

Z góry dziękuję.

Pozdrawiam.

Mariusz
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
alegorn
post
Post #2





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

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


stary temat, ale w sumie wart by dac odpowiedz (IMG:style_emoticons/default/wink.gif)
o ile dobrze rozumiem - chodzi by wybrac jendna galaz z drzewa?


PARENT_ID - zmienna zawierajaca id, od ktorego pobieramy galaz
masz tutaj takze zliczanie elementow w galezi drzewa.


  1. SELECT
  2. node.name,
  3. (COUNT(parent.id) - (sub_tree.lvl + 1)) AS lvl,
  4. node.id,
  5. ROUND((((`node`.`rgt` - `node`.`lft`) - 1) / 2),0) AS `child_count`
  6.  
  7. FROM tree AS node,
  8. tree AS parent,
  9. tree AS sub_parent,
  10. (
  11. SELECT node.id, (COUNT(parent.id) - 1) AS lvl, parent.id AS parentId
  12. FROM tree AS node,
  13. tree AS parent
  14. WHERE node.lft BETWEEN parent.lft AND parent.rgt
  15. AND node.id = PARENT_ID
  16. GROUP BY node.id
  17. ORDER BY node.lft
  18. )AS sub_tree
  19. WHERE node.lft BETWEEN parent.lft AND parent.rgt
  20. AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
  21. AND sub_parent.id = sub_tree.id
  22. GROUP BY node.id
  23. ORDER BY node.lft;
  24.  
  25.  




z doswiadczenia wiem, ze najlepej to opakowac do procedury..
w swoim czasie napisalem chyba wszystkie funkcje (w sql (IMG:style_emoticons/default/wink.gif) ) dla obslugi drzewka (wstawiania, kasowanie, przenoszenie elementow i galezi, pobranie sciezki etc.) fajna zabawa, w zasadzie do dzis z tego korzystam,

btw to chyba najwydajniejszy sposob na drzewko, przynajmniej jesli mamy dynamiczna ilosc zaglebien.

j.


edit: oczywiscie to zapytanie daje nam drzewko w upozadkowanej strukturze.
jesli bysmy mieli tylko wybrac wszystkie elementy z danej galezi - no to wystarczy beetwen lft and rgt

Ten post edytował alegorn 12.04.2012, 15:05:47
Go to the top of the page
+Quote Post

Posty w temacie


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: 12.10.2025 - 01:18