Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] Grupowanie kategorii
markuz
post 26.11.2013, 09:49:58
Post #1





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


Witam,

Posiadam tabelę kategorie o polach id, name, sub_id

Przykładowe dane:

id name sub_id
1 a 0
2 b 1
3 c 1
4 d 0

Chciałbym aby kategorie zostały pogrupowane według głównych kategorii (czyli wtedy gdy sub_id == 0) np.

Kategoria a
- Kategoria b
- Kategoria c
Kategoria d

Proszę o pomoc smile.gif
Pozdrawiam

Ten post edytował markuz 26.11.2013, 09:53:55


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
nospor
post 26.11.2013, 09:55:40
Post #2





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




http://nospor.pl/grupowanie-wynikow.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
markuz
post 26.11.2013, 10:02:18
Post #3





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


Trafiłem na Twój artykuł wcześniej aczkolwiek myślałem, że da się to zrobić bez użycia PHP w czystym SQL. Da się? smile.gif


--------------------
Go to the top of the page
+Quote Post
nospor
post 26.11.2013, 10:07:19
Post #4





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




Moglbys uzywac LEFT JOIN, ale i tak wowczas nie uzyskasz dokladnie tego co napisales.
W czystym mysql raczej nie dojdziesz do kladnie do tego co tu pokazales ze chcesz miec. baza tak nie zwraca danych. Uzyskaszdane w postaci

Kategoria a kategoria b
Kategoria a kategoria c
Kategoria d null

a nie o to ci chodzi. Tak czy siak bedziesz to musial obrobic w php by wlasciwie wyswietlic na stronie


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

"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
markuz
post 26.11.2013, 10:10:40
Post #5





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


Ok. Dzięki za pomoc. Dla innych rozwiązanie gdyby ktoś potrzebował:
  1. foreach($categories as $cat)
  2. {
  3. if($cat['parent_cat_id'] == 0)
  4. {
  5. $group_categories[$cat['id']] = array(
  6. 'name' => $cat['name'],
  7. 'sub' => FALSE,
  8. );
  9. }
  10. else
  11. {
  12. $group_categories[$cat['parent_cat_id']]['sub'][] = array(
  13. 'id' => $cat['id'],
  14. 'name' => $cat['name'],
  15. );
  16. }
  17. }


--------------------
Go to the top of the page
+Quote Post
nospor
post 26.11.2013, 10:15:14
Post #6





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




Nie zadne 'sub' => FALSE tylko 'sub' => array() W arcie masz to wyraznie zaznaczone.
Twoim sposobem lecisz potem podkategorie i dodajesz element tablicy do FALSE.... No troche logiki.

I jak juz podajesz rozwiazanie dla potomnych to przydaloby napisac skadzes wytrzasnal tablice $categories. Bądź konsekwentny, bo bez tej informacji twoje rozwiazanie dla potomnych jest do niczego.


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

"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
markuz
post 26.11.2013, 10:18:24
Post #7





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


Ja wolę 'sub' => FALSE ponieważ przy wyświetlaniu łatwo mogę sobie sprawdzić czy podkategorie istnieją, jeśli nie istnieją to zmienna 'sub' == FALSE jeśli istnieją to 'sub' jest tablicą.


--------------------
Go to the top of the page
+Quote Post
nospor
post 26.11.2013, 10:22:23
Post #8





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




do tego sluzy EMPTY ktore czy to false, czy pusta tablica zwraca ci to samo i nie ma zadnego problemu
A wg. twojej logiki jak pisalem dodajesz nagle ni z gruszki ni zpietruszki cos do FALSE. Skoro cos moze byc tablicą, to powinno to byc jawnie zaznaczone przez array(). Ucz sie pisac poprawnie.


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

"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
markuz
post 26.11.2013, 10:28:34
Post #9





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


W takim razie daję całość poprawioną dla potomnych smile.gif
Kontroler:
  1. $group_categories = array();
  2. $categories = $this->categories_MD->get();
  3. if($categories->num_rows() > 0)
  4. {
  5. foreach($categories->result_array() as $cat)
  6. {
  7. if($cat['parent_cat_id'] == 0)
  8. {
  9. $group_categories[$cat['id']] = array(
  10. 'name' => $cat['name'],
  11. 'sub' => array(),
  12. );
  13. }
  14. else
  15. {
  16. $group_categories[$cat['parent_cat_id']]['sub'][] = array(
  17. 'id' => $cat['id'],
  18. 'name' => $cat['name'],
  19. );
  20. }
  21. }
  22. }

Widok:
  1. <?php
  2. if(!empty($group_categories)) {
  3. echo '<ul>';
  4. foreach($group_categories as $parent_category) {
  5. echo '<li>'.$parent_category['name'];
  6. if(!empty($parent_category['sub']))
  7. {
  8. echo '<ul>';
  9. foreach($parent_category['sub'] as $sub_category)
  10. {
  11. echo '<li>'.$sub_category['name'].'</li>';
  12. }
  13. echo '</ul>';
  14. }
  15. echo '</li>';
  16. }
  17. echo '</ul>';
  18. }
  19. ?>

Mam nadzieję, że wszystko jest już poprawnie napisane smile.gif
Całość pisana na frameworku CodeIgniter.

Ten post edytował markuz 26.11.2013, 10:29:28


--------------------
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 - 09:07