Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie pobierające wartości z kilku tabel.
Forum PHP.pl > Forum > Bazy danych > MySQL
mayu11
Witajcie, pojawił mi się lekko skomplikowany jak dla mnie problem.

Stworzyłem 3 tabele:
  • Kategorie
    • ID
    • Nazwa
    • Oznaczenie
  • Przedmioty
    • ID
    • Nazwa
    • Plik
    • Miniatura
  • PrzedmiotyDoKategorii
    • ID
    • IDPrzedmiot
    • IDKategoria


I przy przykładowo takich danych:

Cytat
Kategorie
1 Nazwa1 OZNACZENIE
2 Nazwa2 DRUGIEOZNACZENIE
3 Nazwa3 TRZECIE

Przedmioty
1 Przedmiot1 File.rar Thumb1.png
2 Przedmiot2 foo.rar Thumb2.png

PrzedmiotyDoKategorii
1 1 1
2 1 2
3 2 1
4 2 2
5 2 3


chcę wyświetlić to w takiej formie:

Cytat
Przedmiot1 (DOMYŚLNEOZNACZENIE OZNACZENIE DRUGIEOZNACZENIE)
Przedmiot2 (DOMYŚLNEOZNACZENIE OZNACZENIE DRUGIEOZNACZENIE TRZECIE)


"Przedmioty.Nazwa (Kategorie.Oznaczenie[, Kategorie.Oznaczenie, ...])"

Póki co.. dla samego działania zrobiłem to tak:

  1. $SQL_Przedmioty = mysql_query('SELECT * FROM Przedmioty');
  2.  
  3. If( mysql_num_rows($SQL_Przedmioty ) )
  4. {
  5. While( $Przedmiot = mysql_fetch_assoc( $SQL_Przedmioty ) )
  6. {
  7. $Kategorie = array('DOMYŚLNEOZNACZENIE');
  8.  
  9. $SQL_Kategorie = mysql_query('SELECT IDKategoria FROM PrzedmiotyDoKategorii WHERE IDPrzedmiot = '.$Przedmiot['ID']);
  10.  
  11. if( mysql_num_rows( $SQL_Kategorie ) )
  12. {
  13. $SQL_KategorieOznaczenia = mysql_fetch_assoc( $SQL_Categories );
  14. $SQL_Kategoria = mysql_query('SELECT Oznaczenie FROM Kategorie WHERE ID = '.$KategorieOznaczenia['IDKategoria']);
  15.  
  16. if( mysql_num_rows( $SQL_Names ) )
  17. {
  18. $Kategoria = mysql_fetch_assoc( $SQL_Names );
  19. $Kategorie[] = $Kategoria['Oznaczenie'];
  20. }
  21. }
  22.  
  23. echo $Przedmiot['Nazwa'].' ('.implode($C, ' ').')<br/>';
  24. }
  25. }


Wiem, że jest to niepoprawne.., ale nie wiem jak to złączyć w jedno zapytanie. Byłbym wdzięczny gdybyście mi pomogli, bo to prawdopodobnie da zmieścić się w 2-4 linijki.
nospor
Jedno zapytanie z LEFT JOIN a potem w php grupujesz jak chcesz. Tu masz przyklad
http://nospor.pl/grupowanie-wynikow.html
mmmmmmm
Etam, użyj GROUP_CONCAT
nospor
żadne etam.... w linku co podalem jest też przykład z GROUP_CONCAT tongue.gif No ale czytać trzeba umieć wink.gif
mayu11
Póki co jakoś wyszło coś takiego:


  1. $Przedmioty = array( );
  2.  
  3. $SQL_Przedmioty = mysql_query('SELECT * FROM Przedmioty
  4. LEFT JOIN PrzedmiotyDoKategorii PDK on PDK.ItemID = Przedmioty.ID');
  5.  
  6. while( $Przedmiot = mysql_fetch_assoc($SQL) )
  7. {
  8. if( !isSet( $Przedmioty[$t['Nazwa']] ) )
  9. $Przedmioty[$Przedmiot['Nazwa']] = $Przedmiot;
  10. else
  11. $Przedmioty[$Przedmiot['Nazwa']]['IDKategorii'] .= ' '.$t['IDKategorii']; // ' ' - separator
  12.  
  13. }


Z tym, że jest pewien problem..

Gdy wpisuje ten SQL w PHPMyAdmin to.. ID mam: 1, 1 (Przy jednym przedmiocie, dwóch kategoriach),
a gdy wypisuje print_r, to wyświetla mi, że ID idą: 1, 2.. przez co muszę index tablicy nazywać przez nazwę, a nie przez ID.

Ale.. to nadal są tylko ID z tej poprzedniej tabeli ;/ A ja tu mam trzy tabele, nie dwie.

Jeszcze spróbuję z tym group_concat.
nospor
Cytat
Ale.. to nadal są tylko ID z tej poprzedniej tabeli ;/ A ja tu mam trzy tabele, nie dwie.
Zero włączenia zarowki w głowie tylko clonowanie kodu z przykładu.... skoro masz trzy tabele to w LEFT JOIN musisz dodać też tą trzecią - logiczne
mayu11
  1. $Przedmioty = array( );
  2.  
  3. $SQL = mysql_query('SELECT Przedmioty.ID, Przedmioty.Nazwa as NazwaPrzedmiotu, Kat.Nazwa FROM Przedmioty
  4. RIGHT JOIN PrzedmiotyDoKategorii PDK on PDK.IDPrzedmiot = Przedmioty.ID
  5. LEFT JOIN Kategorie Kat on Kat.ID = PDK.IDKategoria');
  6.  
  7. while( $Przedmiot = mysql_fetch_assoc($SQL) )
  8. {
  9. if( !isSet( $Przedmiot[$Przedmiot['ID']] ) )
  10. {
  11. $Przedmioty[$Przedmiot['ID']] = $Przedmiot;
  12. $Przedmioty[$Przedmiot['ID']]['Oznaczenie'] = 'DOMYŚLNEOZNACZENIE '.
  13. $Przedmioty[$Przedmiot['ID']]['Oznaczenie'];
  14. }
  15. else
  16. $Items[$Przedmiot['ID']]['Label'] .= ' '.$Przedmiot['Oznaczenie'];
  17. }
  18.  
  19. foreach( $Przedmioty as $Przedmiot )
  20. {
  21. echo $Przedmiot['NazwaPrzedmiotu'] .' ('.$Przedmiot['Oznaczenie'].')<br/>';
  22. }


Dzięki wielkie. Jedno zapytanie, zawsze lepsze od trzech.
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.