Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> parent_id i group by
miojamo
post 24.06.2010, 09:28:58
Post #1





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 28.05.2010

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


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
paziek
post 25.06.2010, 10:20:26
Post #2





Grupa: Zarejestrowani
Postów: 207
Pomógł: 25
Dołączył: 16.11.2006

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


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?

Ten post edytował paziek 25.06.2010, 10:21:45
Go to the top of the page
+Quote Post
nospor
post 25.06.2010, 10:23:26
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




http://nospor.pl/grupowanie-wynikow-n35.html


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
miojamo
post 25.06.2010, 11:17:45
Post #4





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 28.05.2010

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


Ale w tych przykładach uzyte są 2 tabelki a jak zrobić to z jedną tabelką jak w poście 1?
Go to the top of the page
+Quote Post
nospor
post 25.06.2010, 11:23:36
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
miojamo
post 25.06.2010, 11:48:25
Post #6





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 28.05.2010

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


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
Go to the top of the page
+Quote Post
phpion
post 25.06.2010, 12:03:12
Post #7





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
nospor
post 25.06.2010, 12:08:30
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
miojamo
post 25.06.2010, 12:16:52
Post #9





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 28.05.2010

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


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
Go to the top of the page
+Quote Post
nospor
post 25.06.2010, 12:20:03
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
miojamo
post 25.06.2010, 13:42:36
Post #11





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 28.05.2010

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


a czy nie da sie tego w jednym zapytaniu? bez obróbki php?
Go to the top of the page
+Quote Post
nospor
post 25.06.2010, 13:47:13
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No nie, obróbka php musi być.
Poza tym to jest jedno zapytanie smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 07:42