Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Wyświetlenie wielu rekordów z kilku tabel
Forum PHP.pl > Forum > Przedszkole
Przemo75
Witam,
Mam problem z wyświetleniem wielu danych z dwóch tabel. Jednej kategorii z tabeli KATEGORIA odpowiada kilka(naście) produktów z tabeli ASORTYMENT.
Problem polega na tym, że w tej chwili wyniki wyświetlane są w sposób:
Kategoria1
Nazwa1
Opis1
Produkt1

Kategoria1
Nazwa1
Opis1
Produkt2

... itd.

a chciałbym osiągnąć wynik:

Kategoria1
Nazwa1
Opis1
Produkt1
Produkt2
Produkt3

itd.

  1. <?php
  2. include("connections/baza_pass.php");
  3. $sql = "SELECT * FROM kategoria ORDER BY id_kategorii ASC";
  4.  
  5. $numresults=mysql_query($sql, $link);
  6. $numrows=mysql_num_rows($numresults);
  7.  
  8. if($numrows>0){
  9.  
  10. echo '<form action="" method="post">';
  11. echo '<select name="kategoria" onChange="this.form.submit()">';
  12. echo '<option value="">Wybierz kategorię:</option>';
  13. while($wybor = mysql_fetch_array($numresults))
  14. {
  15. $id_kategorii = $wybor["id_kategorii"];
  16. $nazwa = $wybor["nazwa"];
  17. $opis = $wybor["opis"];
  18.  
  19. echo '<option value="'.$id_kategorii.'">'.$nazwa.'</option>';
  20. }
  21. echo '</select>';
  22. echo '</form>';
  23. }
  24. else
  25. {
  26. echo 'Brak wyników';
  27. }
  28.  
  29.  
  30. @$kategoria = $_POST['kategoria']; // ten warunek musi byc zawsze
  31.  
  32. if ($kategoria)
  33. {
  34.  
  35. echo "<br>\n";
  36. $link=mysql_query("SELECT * FROM kategoria as k, asortyment as a WHERE k.id_kategorii=a.id_kategorii AND a.id_kategorii='$kategoria'");
  37. while($wybor2=mysql_fetch_array($link))
  38. {
  39. $id_kategorii = $wybor2["id_kategorii"];
  40. $nazwa = $wybor2["nazwa"];
  41. $opis = $wybor2["opis"];
  42. $produkt = $wybor2["produkt"];
  43.  
  44. echo "<br>\n";
  45. echo '<p class="text">Nazwa kategorii: <b>'. $nazwa .'</b></p>';
  46. echo '<p class="text">Opis kategorii:</p>';
  47. echo '<p class="text"><b>'. $opis .'</b></p>';
  48. echo '<p class="text">Produkty:</p>';
  49. echo '<p class="text"><b>'. $produkt .'</b></p>';
  50. echo "<br>\n";
  51. }
  52. }
  53. ?>

Zapewne trzeba użyć warunku IF ale nie mam pojęcia w jaki sposób.
nospor
Pisałem o tym:
http://nospor.pl/grupowanie-wynikow.html
może ci się przyda.
CuteOne
google -> LEFT JOIN
Przemo75
@nospor
Wielkie dzięki za ogromne wsparcie (linkiem). Początkowo myślałem, że nie dam rady tego przerobić na swoje potrzeby ale na (moje) szczęście się udało.

Poniżej poprawiony kod (może nie wygląda najlepiej ale cóż).

  1. @$kategoria = $_POST['kategoria'];
  2.  
  3. if ($kategoria)
  4. {
  5. $link=mysql_query(" SELECT GROUP_CONCAT(a.produkt ORDER BY a.id_asort ASC SEPARATOR ';;;') PRODUCTS, k.id_kategorii kid, k.nazwa knazwa, k.opis kopis FROM kategoria k LEFT JOIN asortyment a ON a.id_kategorii = k.id_kategorii WHERE k.id_kategorii='$kategoria' GROUP BY a.id_kategorii ORDER BY a.id_asort ASC ");
  6.  
  7. $categories = array();
  8. while ($wybor2 = mysql_fetch_array($link)){
  9. $kid = $wybor2['kid'];
  10.  
  11. $categories[$kid] = array('nazwa' => $wybor2['knazwa'], 'opis' => $wybor2['kopis'], 'products' => array());
  12.  
  13. if (!empty($wybor2['PRODUCTS']))
  14. {
  15. $products = explode(';;;',$wybor2['PRODUCTS']);
  16. foreach ($products as $produkt){
  17. $categories[$kid]['products'][] = $produkt;
  18. }
  19. }
  20. }
  21.  
  22. echo '<br><ul>';
  23. foreach ($categories as $idCat => $category)
  24. {
  25. echo '<li><b>'.$category['nazwa'].'</b><br><br>';
  26. echo '<li>'.$category['opis'].'<ul><br>';
  27. foreach ($category['products'] as $produkt)
  28. {
  29. echo '<li>'.$produkt.'</li>';
  30. }
  31. echo '</ul></li>';
  32. }
  33. echo '</ul>';
  34.  
  35. }


Jeszcze jedno pytanie. W jaki sposób trzeba zmodyfikować kod, aby uzyskać nr id (a.id_asort) dla każdego otrzymanego produktu?
nospor
Użyłeś wersji z GROUP_CONCAT... wersję tę napisałem pod "przymusem" po czym podałem jej wady. I ty właśnie chcąc dodatkowych informacji, trafiłeś właśnie na główną wadę tej wersji smile.gif

No nic, miałes do wyboru jeszcze inną wersję, wybrałeś tą więc teraz cierp wink.gif Musisz poprostu dopisać kolejnego GROUP_CONCAT na pole, które chcesz uzyskać.
Przemo75
No to będzie mała jazda.
Wracając do obecnego stanu kodu zauważyłem, niestety, że niektóre wyniki zapytania nie wyświetla w całości, np.
Nazwa produktu 1
Nazwa produktu 2
...
Nazwa produ
a co za tym idzie, nie wyświetla wszystkich rekordów z bazy.
nospor
Użyj pierwszej wersji z mojego arta. Ona jest normalna.
Tą którą użyłeś, napisałem pod wpływem "grupy nacisku" i z niechęcią smile.gif
Przemo75
Bingo smile.gif Teraz działa jak należy.

@nospor
Raz jeszcze wielkie dzięki.
  1. @$kategoria = $_POST['kategoria'];
  2.  
  3. if ($kategoria)
  4. {
  5. $link=mysql_query(" SELECT a.id_kategorii aid, a.produkt aprodukt, a.id_asort aida, k.id_kategorii kid, k.nazwa knazwa, k.opis kopis FROM kategoria k LEFT JOIN asortyment a ON a.id_kategorii = k.id_kategorii WHERE k.id_kategorii='$kategoria' ORDER BY a.id_asort ASC ");
  6.  
  7. $categories = array();
  8. while ($wybor2 = mysql_fetch_array($link))
  9. {
  10. $kid = $wybor2['kid'];
  11.  
  12. if (!isset($categories[$kid]))
  13. $categories[$kid] = array('nazwa' => $wybor2['knazwa'], 'opis' => $wybor2['kopis'], 'products' => array());
  14.  
  15. if (!empty($wybor2['aprodukt']))
  16. $categories[$kid]['products'][] = array('produkt' => $wybor2['aprodukt'], 'id_asort' => $wybor2['aida']);
  17. }
  18. //print_r($categories); //do obejrzenia jak wygląda wygenerowana tablica
  19.  
  20. echo '<br><ul>';
  21. foreach ($categories as $idCat => $category)
  22. {
  23. echo '<li><b>'.$category['nazwa'].'</b><br>';
  24. echo '<li>'.$category['opis'].'<ul>';
  25. foreach ($category['products'] as $produkty)
  26. {
  27. echo '<li>'.$produkty['produkt'].' - id '.$produkty['id_asort'].'</li>';
  28. }
  29. echo '</ul></li>';
  30. }
  31. echo '</ul>';
  32. }

Mam nadzieję, że kolejny krok - edycja - będzie analogiczna i nie będzie stanowiła wielkich problemów.
nospor
A powiedz mi jeszcze ile miałeś produktów w kategorii, gdzie produkty zaczęły ci się źle wyświetlać?
Przemo75
Tylko 13 produktów i chyba w ostatnim był ten błąd. W innej kategorii w 17 produkcie na 28.
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.