Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zapytanie pobierające wartości z kilku tabel.
mayu11
post 30.05.2013, 12:44:42
Post #1





Grupa: Zarejestrowani
Postów: 99
Pomógł: 9
Dołączył: 9.09.2008

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


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.
Go to the top of the page
+Quote Post
nospor
post 30.05.2013, 12:46:25
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jedno zapytanie z LEFT JOIN a potem w php grupujesz jak chcesz. Tu masz przyklad
http://nospor.pl/grupowanie-wynikow.html


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mmmmmmm
post 30.05.2013, 13:07:53
Post #3





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Etam, użyj GROUP_CONCAT
Go to the top of the page
+Quote Post
nospor
post 30.05.2013, 13:09:14
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




żadne etam.... w linku co podalem jest też przykład z GROUP_CONCAT tongue.gif No ale czytać trzeba umieć wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mayu11
post 30.05.2013, 13:14:58
Post #5





Grupa: Zarejestrowani
Postów: 99
Pomógł: 9
Dołączył: 9.09.2008

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


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.
Go to the top of the page
+Quote Post
nospor
post 30.05.2013, 13:17:45
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mayu11
post 30.05.2013, 13:46:06
Post #7





Grupa: Zarejestrowani
Postów: 99
Pomógł: 9
Dołączył: 9.09.2008

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


  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.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 01:43