Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: parent_id i group by
Forum PHP.pl > Forum > Bazy danych > MySQL
miojamo
Witam,


Struktura tabeli

id | parent_id| name
1 0 vw
2 0 audi
3 2 a3
4 1 passat
....


Potzrebuje wyswietlic array poukladana czyli

- vw
--passat
- audi
-- a3


dzieki
paziek
Kod
SELECT name FROM tabela ORDER BY parent_id ASC, id ASC


EDIT: Jednak nie. Nie wiem w jaki sposób to jest poukładane... ORDER BY name DESC?
nospor
http://nospor.pl/grupowanie-wynikow-n35.html
miojamo
Ale w tych przykładach uzyte są 2 tabelki a jak zrobić to z jedną tabelką jak w poście 1?
nospor
Analogicznie. Left join robisz na tę samą tabelę.
glowny warunek ma byc parent_id = 0 a left join ma byc łączony przez parent_id


Ale skoro to jet
miojamo
hmm nie bardzo chce to dzialac:

  1.  
  2. SELECT DISTINCT c.name FROM #__cd_categories c
  3. LEFT JOIN #__cd_categories p on p.parent_id = c.ID
  4. ORDER BY c.NAME ASC, p.NAME ASC
phpion
Opiszę Ci jak ja to robię. Będę bazował na Twoim przykładzie i danych.

1. Wykonujesz zapytanie:
  1. SELECT * FROM categories ORDER BY name ASC;

Dzięki temu będziesz miał dane odpowiednio posortowane (jako kolumna sortująca możesz wybrać cokolwiek).

2. Pobierasz dane, przelatujesz po nich pętlą - nie podam Ci dokładnego kodu, ale napiszę jaką tablicę powinieneś dostać na wyjściu:
  1. $data = array(
  2. 0 => array(
  3. array('id' => 2, 'parent_id' => 0, 'name' => 'audi'),
  4. array('id' => 1, 'parent_id' => 0, 'name' => 'vw')
  5. ),
  6. 2 => array(
  7. array('id' => 3, 'parent_id' => 2, 'name' => 'a3')
  8. ),
  9. 1 => array(
  10. array('id' => 4, 'parent_id' => 1, 'name' => 'passat')
  11. )
  12. );

Struktura jest taka: klucz tablicy to po prostu parent_id, a wartości to tablica elementów przyporządkowanych do danego rodzica. Kolejność kluczy nie ma większego znaczenia, ważne, że dzieciaki są uporządkowane winksmiley.jpg według porządku, który podałeś w ORDER BY.

3. Wyświetlenie drzewa to prosta funkcja rekurencyjna, do której podajesz jako parametr całą tablicę danych oraz id aktualnie generowanego poziomu, np.
  1. $tree = tree($data, 0);

Ten kod powinien wyświetlić tylko elementy dla parent_id = 0 czyli audi i vw.

4. Wewnątrz tej funkcji iterujesz po każdych elementach danego poziomu (dla 0 wspomniane audi i vw). Po wyświetleniu danego elementu wykonujesz rekurencyjnie:
  1. $return .= tree($data, $item['parent_id']);

dzięki czemu będziesz miał również wyświetlanie kolejnych potomków.

Całość najlepiej wyświetlić w postaci listy <ul> - będziesz wówczas widział wszelkie zagnieżdżenia.

Jeśli będziesz miał problemy to śmiało pisz.
nospor
Cytat
hmm nie bardzo chce to dzialac:
A konkretnie?

SELECT DISTINCT c.name FROM
pobierasz tylko name jednej tabeli. left joina olales.czemu?
mowilem ci tez ze ma byc warunek WHERE c.parent_id=0
miojamo
Cytat(nospor @ 25.06.2010, 13:08:30 ) *
A konkretnie?

SELECT DISTINCT c.name FROM
pobierasz tylko name jednej tabeli. left joina olales.czemu?
mowilem ci tez ze ma byc warunek WHERE c.parent_id=0



select c.name from #__cd_categories c
join #__cd_categories p on p.parent_id = c.ID
order by c.NAME asc, p.NAME asc


left join jest ale jak dam where c.parent_id = 0 to nie zwraca nic.

Pzrepraszam dla:

select c.name from #__cd_categories c
left join #__cd_categories p on p.parent_id = c.ID
where c.parent_id = 0
order by c.NAME asc, p.NAME asc

zwraca podwójna tablice dla 0

vw
vw
audi
audi
nospor
select c.name from
miales tego SELECT rozwinac o pobranie danych z left join. Jak tego nie zrobic to tracisz info o podkategoriach

Cytat
zwraca podwójna tablice dla 0

vw
vw
audi
audi
I prawidłowo. Dalej w linku co podalem masz napisane jak ją obrobic. Ale najpierw w SELECT pobierz pozostałe dane.
miojamo
a czy nie da sie tego w jednym zapytaniu? bez obróbki php?
nospor
No nie, obróbka php musi być.
Poza tym to jest jedno zapytanie smile.gif
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.