Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]zapytanie, drzewo
Forum PHP.pl > Forum > Przedszkole
Gość
Witam

Mam w bazie danych liste kategorii i subkategorii. Chcialbym pobrac wszystko za pomoca jednego zapytania posortowane w odpowiedni sposob.

w bazie wyglada to tak:

  1. id parent_id name
  2. 1 null papier
  3. 2 null folia
  4. 3 null filc
  5. 4 1 gruby
  6. 5 2 zwykła
  7. 6 2 bąbelkowa
  8. 7 1 cieńki
  9. 8 1 samoprzylepny
  10. 9 3 200g
  11. 10 1 teksturowany


czyli powinno zostac posortowane w ten sposob
  1. papier
  2. cieńki
  3. gruby
  4. samoprzylepny
  5. teksturowany
  6. filc
  7. 200g
  8. folia
  9. zwykła
  10. bąbelkowa


Moglbym na poczatek pobrac wszystkie elementy w ktorych parent==null, pozniej przejechac je po kolei i popobierac ich dzieci. Ale moze da sie jakos bardziej w SQL, mniej w PHP?
Gość
PS: dodajmy do tego order

  1. id parent_id order name
  2. 1 null 1 papier
  3. 2 null 3 folia
  4. 3 null 2 filc
  5. 4 1 2 gruby
  6. 5 2 1 zwykła
  7. 6 2 2 bąbelkowa
  8. 7 1 1 cieńki
  9. 8 1 3 samoprzylepny
  10. 9 3 1 200g
  11. 10 1 4 teksturowany
john_doe
Jednym zapytaniem to tak w sensie kodu. W rzeczywistości musisz napisać funkcje rekurencyjna aby to wszystko wyświetlić. Czyli im większe drzewo tym zapytanie poleci wiecej razy
Randallmaster
Twoja tabela musimy wyglądać tak:

id parent_id name

1 0 papier
2 0 folia
3 0 filc
4 1 gruby
5 2 zwykła
6 2 bąbelkowa
7 1 cieńki
8 1 samoprzylepny
9 3 200g
10 1 teksturowany

no i teraz pobierasz dane o parent_id = 0, później pobierając resztę danych podporządkowujesz pola dane id.
Pokaż kod to pomożemy.
Gosc134
Temat na czasie, czy ktoś może pomóc w budowie drzewa dwu wymiarowego ?

Puki co próbuję stworzyć jakieś mądre tablice by potem to wszystko wyświetlić w formie:

KATEGORIA
- 1
- 2

KATEGORIA2
- 1
- 2
- 3


Ale za chiny nie mogę nic zrobić :-/

  1. <?
  2. $res = mysql_query( 'SELECT * FROM kat ORDER BY id' );
  3.  
  4. while ($row = mysql_fetch_array($res)){
  5. $name = $row['title'];
  6. $id = $row['id'];
  7. $rodzic = $row['parents'];
  8.  
  9. if($rodzic==1) {
  10. $kate[$rodzic][$id] = $name;
  11. } else {
  12. $kate[$id] = $name;
  13. }
  14. }
  15. echo'<pre>';
  16. print_r($kate);
  17. echo'</pre>';
  18.  
  19. ?>


A tabela wygląda tak: id | title | parents

Czy ktoś pomoże w budowie tablic i ewentualnym wyświetleniu ich ?
lukasz_os
Do wyboru masz wiele konstrukcji drzewiastych umorzliwiające takie rozwizanie jakie Tobie potrzebne. Np. nested sets, drzewa IP czy adjacency list. Pogoogluj, poszukaj i wybierz co akurat odpowiada.
-Gosc134-
Mam, Znalazłem prosty i skuteczny kod. Oto chodziło.

Tylko mam pewne obawy co do global $data, $index;

Czy to jest bezpieczne ?
Jak można to usunąć by wszystko działało ?

  1. <?php
  2. $data = array();
  3. $index = array();
  4. $query = mysql_query("SELECT * FROM kategory ORDER BY title");
  5. while ($row = mysql_fetch_assoc($query)) {
  6. $id = $row["id"];
  7. $parent_id = $row["parents"] === '' ? "" : $row["parents"];
  8. $data[$id] = $row;
  9. $index[$parent_id][] = $id;
  10. }
  11.  
  12. function display_child_nodes($parent_id, $level)
  13. {
  14. global $data, $index;
  15. $parent_id = $parent_id === '' ? "" : $parent_id;
  16. if (isset($index[$parent_id])) {
  17. foreach ($index[$parent_id] as $id) {
  18. echo str_repeat("-", $level) . $data[$id]["title"] . "<br/>";
  19. display_child_nodes($id, $level + 1);
  20. }
  21. }
  22. }
  23. display_child_nodes(NULL, 0);
  24. ?>
Gosc134
Witam,

Ostatnie pytanie mam kod:

  1. <?php
  2. $c = mysql_query('SELECT * FROM `kat` ORDER BY `parents` ') or die(mysql_error());
  3.  
  4. $tree = array();
  5. while ($row = mysql_fetch_assoc($c))
  6. {
  7. if (!$row['parents'])
  8. {
  9. $tree[$row['id']] = $row;
  10. }
  11. else
  12. {
  13. if (!isset($tree[$row['parents']]['children']))
  14. {
  15. $tree[$row['parents']]['children'] = array();
  16. }
  17.  
  18. $tree[$row['parents']]['children'][] = $row;
  19.  
  20. }
  21. }
  22. foreach($tree as $v)
  23. {
  24. echo $v['title'].'<br/>';
  25. foreach($v['children'] as $v)
  26.  
  27. { echo'--'.$v['title'].'<br>';}
  28.  
  29. }
  30. ?>


I On wyświetla coś takiego:

Cytat
Oświata

Warning: Invalid argument supplied for foreach() in /kat.php on line 48
Medycyna
--Lekarze
Sklepy

Warning: Invalid argument supplied for foreach() in /kat.php on line 48


Jak zrobić by wyświetlało się poprawnie i z id danego elementu czyli np.:

Cytat
1|Oświata
2|Medycyna
--4|Lekarze
3|Sklepy


Bardzo dziękuję za pomoc bo walczę z tym od wczoraj :-/
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.