Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Ograniczenie pętli
adam882
post
Post #1





Grupa: Zarejestrowani
Postów: 289
Pomógł: 1
Dołączył: 2.11.2007

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


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. ?>


Go to the top of the page
+Quote Post
sunpietro
post
Post #2





Grupa: Zarejestrowani
Postów: 262
Pomógł: 26
Dołączył: 23.01.2009
Skąd: eZ Systems

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


jest coś takiego jak rekurencja
poczytaj ten art: rekurencja - wielopoziomowe kategorie
on powinien ciebie naprowadzić na rozwiązanie (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
kefirek
post
Post #3





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


  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. }


Ten post edytował kefirek 25.06.2011, 10:10:05
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Rekurencyjnie zapytania? Najgorsze z możliwych wyjść.

Poguglajcie "mysql drzewka", znajdziecie kilka dużo lepszych i wydajniejszych sposobów.
Go to the top of the page
+Quote Post
adam882
post
Post #5





Grupa: Zarejestrowani
Postów: 289
Pomógł: 1
Dołączył: 2.11.2007

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


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?
Go to the top of the page
+Quote Post
sunpietro
post
Post #6





Grupa: Zarejestrowani
Postów: 262
Pomógł: 26
Dołączył: 23.01.2009
Skąd: eZ Systems

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


To chyba tutaj pomoc zagnieżdżone SELECT z count w zapytaniu. Lecz nie wiem czy to nie obniży wydajności zapytania.
Go to the top of the page
+Quote Post
kefirek
post
Post #7





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


  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


Ten post edytował kefirek 26.06.2011, 11:41:50
Go to the top of the page
+Quote Post
adam882
post
Post #8





Grupa: Zarejestrowani
Postów: 289
Pomógł: 1
Dołączył: 2.11.2007

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


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]

Ten post edytował adam882 26.06.2011, 13:58:07
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 18:11