Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Ograniczenie pętli
Forum PHP.pl > Forum > Przedszkole
adam882
Witam

Posiadam tabelę "kategorie" o takiej strukturze: id | nazwa | ile | parent. Kategorie główne mają "parent"=0, natomiast podkategorie zawierają w "parent", id kategorii głównej. Nie mam pomysłu jak to zrobić, aby ograniczyć wszystko do jednej pętli.

Obecnie wygląda to mniej więcej tak:
  1. <?php
  2. $q=mysql_query('SELECT id, nazwa FROM kategorie WHERE parent=0'); //Pobiera kategorię główną bez rodzica
  3. while($r=mysql_fetch_array($q))
  4. {
  5. echo '<b>Kategoria: '.$r['nazwa'].'</b><br />';
  6. $q2=mysql_query('SELECT * FROM kategorie WHERE parent='.$r['id'].''); //Pobiera podkategorie rodzica
  7. while($r2=mysql_fetch_array($q2))
  8. {
  9. echo 'Podkategoria: '.$r2['nazwa'].' ('.$r2['ile'].')<br />';
  10. }
  11. echo '<br />';
  12. }
  13. ?>


sunpietro
jest coś takiego jak rekurencja
poczytaj ten art: rekurencja - wielopoziomowe kategorie
on powinien ciebie naprowadzić na rozwiązanie wink.gif
kefirek
  1. $q=mysql_query('SELECT k.nazwa AS cat_name, p.nazwa AS pod_name FROM kategorie k INNER JOIN test p ON (p.parent=k.id) ORDER BY k.nazwa');
  2. $cat = 0;
  3. while($r=mysql_fetch_array($q))
  4. {
  5. if($r['cat_name'] != $cat){
  6.  
  7. echo '<b>Kategoria: '.$r['cat_nazwa'].'</b><br />';
  8.  
  9. }
  10.  
  11. echo 'Podkategoria: '.$r['pod_name'].' ('.$r['ile'].')<br />';
  12.  
  13. $cat = $r['cat_name'];
  14.  
  15. }
erix
Rekurencyjnie zapytania? Najgorsze z możliwych wyjść.

Poguglajcie "mysql drzewka", znajdziecie kilka dużo lepszych i wydajniejszych sposobów.
adam882
Mam coś takiego:

  1. SELECT k.nazwa AS cat_name, p.nazwa AS pod_name, p.ile AS pod_ile FROM kategorie k INNER JOIN kategorie p ON (p.parent=k.id) ORDER BY k.nazwa

Trochę dziwnie wygląda podwójne łączenie tej samej tabeli, ale cóż..

Troszkę teraz kombinuję z tym zapytaniem, aby zwracało mi nie tylko nazwę kategorii głównej, a potem listy podkategorii, ale również obok kategorii głównej pokazywało mi zliczoną ilość [ile] dla wszystkich podkategorii w danej kategorii. Ma ktoś może jakieś pomysły?
sunpietro
To chyba tutaj pomoc zagnieżdżone SELECT z count w zapytaniu. Lecz nie wiem czy to nie obniży wydajności zapytania.
kefirek
  1. SELECT k.nazwa AS cat_name, p.nazwa AS pod_name, p.ile AS pod_ile,
  2. (SELECT COUNT(*) FROM kategorie c WHERE k.parent=c.id) AS num
  3. FROM kategorie k INNER JOIN kategorie p ON (p.parent=k.id) ORDER BY k.nazwa
adam882
Z pomocą ułożyłem potrzebne zapytanie mysql:
  1. SELECT k.nazwa AS cat_name, p.id AS pid, p.nazwa AS pod_name, p.ile AS pod_ile,
  2. (SELECT SUM(c.ile) FROM kategorie c WHERE c.parent=k.id) AS num
  3. FROM kategorie k INNER JOIN kategorie p ON (p.parent=k.id) ORDER BY k.nazwa

które wrzucone w pętle razem z warunkami wyświetla się mniej więcej tak:
Nazwa kategorii (5)
- podkategoria (3)
- podkategoria (2)

Zastanawia mnie tylko, czy takie zapytanie nie obniży wydajności. Trzeba będzie też chyba nałożyć indeksy na [parent]
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.