Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Wyświetlenie listy pozycji i ich odmian jednym zapytaniem..
Forum PHP.pl > Forum > Bazy danych
kukix
Witam.

Struktura bazy:

tabela
--------------
id
name
parent

Do wyświetlenia listy pozycji używam:
  1. <?php
  2. $wynik = sql(SELECT * FROM tabela WHERE parent='';);
  3. while ($pole = mysql_fetch_assoc($wynik)) {
  4. print $pole[name];
  5. (...)
  6.  
  7. $wynik_odmiana = sql(SELECT * FROM tabela WHERE parent=pole[id]);
  8. while ($pole_odmiana = mysql_fetch_assoc($wynik_odmiana)) {
  9. print $pole_odmiana[name];
  10. (...)
  11.  
  12. }
  13. }
  14. ?>


W efekcie tego kodu generuje sie bardzo duża liczba zapytań...

Jak przerobić tą konstrukcje, żeby działała na jednym (połączonym zapytaniu)...

Prosze o pomoc... potrzebuje uzyskać coś takiego:

  1. <LI>Pozycja 1
  2. <LI> >> Pozycja 1 odmiana 1
  3. <LI> >> Pozycja 1 odmiana 2
  4. <LI>Pozycja 2
  5. <LI> >> Pozycja 2 odmiana 1
  6. <LI> >> Pozycja 2 odmiana 2
  7. <LI> >> Pozycja 3 odmiana 3
  8. <LI>Pozycja 3
  9. <LI>(...)



P.S. Problem będzie też z tym, że lista wyników podzielona jest na strony (np. po 10 pozycji glównych (nieodmian))..
Jak ułożyć to zapytanie, żeby MySQL wyświetlał te 10 Pozycji (nadrzędnych) i nie bral pod uwagę liczbe odmian...?

P.S.2 Jest to podobne do drzew kategorii.. w tym wypadku wystarczające będą dwie głębokości.. co powinno uprościć sprawę..
wojtek.zielinski
Spróbuj tak. Pisałem od ręki, więc nie gwarantuje działania, ale myślę, że ogólna zasada jest chyba jasna.

  1. <?php
  2. $wynik = sql("SELECT T.id, T.name, P.name AS 'parent_name' FROM tabela T, tabela P WHERE T.parent=P.id ORDER BY T.parent");
  3.  
  4. $parent_name = '';
  5.  
  6. while ($pole = mysql_fetch_assoc($wynik))
  7. {
  8.  $current_parent_name = $pole['parent_name'];
  9. if($current_parent_name != $parent_name)
  10. {
  11. $parent_name = $current_parent_name;
  12. print($parent_name);
  13. }
  14. print($pole['name']);
  15. }
  16. ?>
kukix
Dzieki Wojtku za odpowiedź.
Jednak Twoje zapytanie zwraca tylko pozycje, które mają przypożądkowane podpozycje...a pozostałe nie (bez przypożądkowanych podpozycji)
na innym forum dostałem taką odpowiedź:

  1. $sql = mysql_query("
  2. select
  3. `sons`.`id` as `id`,
  4. `sons`.`name` as `name`,
  5. `sons`.`parent` as `parent`,
  6. `parents`.`id` as `parents_id`,
  7. `parents`.`name` as `parents_name`
  8. from `tabela` as `sons`
  9. left join (
  10. select * from `tabela` where `parent`='' limit $start, $ile
  11. ) as `parents`
  12. on `sons`.`parent`=`parents`.`parents`
  13.  
  14. where `parents`.`id` is not null
  15. order by `parents`.`name`, `sons`.`name`");
  16.  
  17. $prev = array('id'=>'', 'name'=>'', 'parent'=>'');
  18. while($row = mysql_fetch_assoc($sql)){
  19. IF($row['parent']!=$prev['parent']){
  20. echo $row['parents_name'] . "\r\n";
  21. }
  22. echo '>> ' . $row['name'] . "\r\n";
  23. $prev = $row;
  24. }


Jednak to zapytanie wyświetla tylko pozycje nie przypożądkowane do niczego (parent='') i w dodatku wyświetla je dwa razy
W dodatkiu doszło nowe pole 'parents' (nie wiem, skąd się wzieło)...

Pomoże mi ktoś przerobic to zapytanie, żeby było ok..? może jakaś literówka?
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.