Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]Problem z zapytaniem, Zapytanie do trzech tabel
-Gość-
post
Post #1





Goście







Witam!

Mam trzy tabele. Tabele autorzy, publikacje oraz wydarzenia.

Chcę wyświetlić zawartość tych tabel, ale w taki sposób, żeby wiersze z tabel publikacje oraz wydarzenia przypisane były do poszczególnego wiersza z tabelu autorzy.

Struktura opiera się na tym, że tabele autorzy i publikacje w każdym wierszu mają ID każdego autora (tabela autorzy). O ile wyciągnięcie tego z jednej tabeli jest proste, to z potrójnym zapytaniem już sobie najnormalniej nie radzę:)

Wytłumaczę jak krowie na rowie:

Chcę, żeby zapytanie w danym wierszu wyciągało - z tabeli publikacje oraz wydarzenia - tylko te wiersze, w których ID_AUTORA = ID autora z aktualnego wiersza pobranego z tabeli autorzy.

Nie wiem czy jasno to nakreśliłem, ale na minimalną pomoc liczę winksmiley.jpg

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





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


  1. SELECT * FROM autorzy a INNER JOIN wydarzenia w ON (a.id=w.id_autor) INNER JOIN publikacje p ON (a.id=p.id_autor)


--------------------
Go to the top of the page
+Quote Post
-Gość-
post
Post #3





Goście







Cytat(melkorm @ 24.09.2008, 17:37:05 ) *
  1. SELECT * FROM autorzy a INNER JOIN wydarzenia w ON (a.id=w.id_autor) INNER JOIN publikacje p ON (a.id=p.id_autor)


A da się do tego dodac następującą rzecz:
żeby pobierał tylko jeden wiersz autora, a jeśli jest więcej publikacji to wyświetlał je w odpowiedniej komórce tabeli?C
Go to the top of the page
+Quote Post
melkorm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


  1. SELECT GROUP_CONCAT(p.publikacje) AS publikacje , * FROM autorzy a INNER JOIN wydarzenia w ON (a.id=w.id_autor) INNER JOIN publikacje p ON (a.id=p.id_autor)


--------------------
Go to the top of the page
+Quote Post
-Gość-
post
Post #5





Goście







Cytat(melkorm @ 24.09.2008, 17:53:20 ) *
  1. SELECT GROUP_CONCAT(p.publikacje) AS publikacje , * FROM autorzy a INNER JOIN wydarzenia w ON (a.id=w.id_autor) INNER JOIN publikacje p ON (a.id=p.id_autor)


Spróbowałem przerobić na inne tablice testowe (uczę się dopiero) i wypluwa błąd query error.

Jakieś sugestie co do stosowania?
Go to the top of the page
+Quote Post
melkorm
post
Post #6





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


  1. SELECT * , GROUP_CONCAT(p.publikacje) AS publikacje FROM autorzy a INNER JOIN wydarzenia w ON (a.id=w.id_autor) INNER JOIN publikacje p ON (a.id=p.id_autor) GROUP BY a.id


nie testowałem z tego wynikł błąd za który przepraszam tak już powinno chodzić prawidłowo. Jeżeli nadal występuje błąd prosze o wklejenie kodu i wygladu tabeli.

Ten post edytował melkorm 24.09.2008, 21:06:09


--------------------
Go to the top of the page
+Quote Post
-Gość-
post
Post #7





Goście







Cytat(melkorm @ 24.09.2008, 21:05:02 ) *
  1. SELECT * , GROUP_CONCAT(p.publikacje) AS publikacje FROM autorzy a INNER JOIN wydarzenia w ON (a.id=w.id_autor) INNER JOIN publikacje p ON (a.id=p.id_autor) GROUP BY a.id


nie testowałem z tego wynikł błąd za który przepraszam tak już powinno chodzić prawidłowo. Jeżeli nadal występuje błąd prosze o wklejenie kodu i wygladu tabeli.


Dzięki za pomoc!

Widzę jednak, że sam sobie nie poradzę. A więc od początku. Ten przykład z publikacjami to był przykład, chciałem na nim dobrze opisać.

A więc mam trzy tabele:

musicians - w której przechowuję dane wszystkich muzyków
musicians_bands - w której przechowuję informacje o zespołąch, w jakich muzycy grali /jak wiadomo tego jest dużo, więc dlatego osobna tabela
bands - zawiera informacje i zespołach wszystkich.

Teraz:
Struktury tabel musicians i bands nie będę opisywał bo jest standardowa /id, name, etc./. Najważniejsza jest struktura tabeli musicians_bands:
  1. ID | BAND_ID | YEAR_F | YEAR_T

Najważniejsze są te dwa pola, id oraz band_id.
ID - to ID danego artysty, a BAND_ID to id danego zespołu /danych z dwóch poprzednich tabel/


Teraz pytanie: w jaki sposób sformułować zapytanie do bazy, aby wqyświetlał:
  1. Artysta 1 | Zespół 1, Zespół 2
  2. |
  3. --------------------------------------
  4. Artysta 2 |Zespół 3
  5. |
  6. --------------------------------------
  7. Artysta 3 | Zespół 1, Zespół 4
  8. |
  9. --------------------------------------


Czyli generalnie, żeby pobierał dane:
Wszystkie z tabeli musicians => wszystkie z tabeli musicians_bands => band_name z bands. Tylko, żeby wyplute wyniki z bands_musicians wyświetlał w jednej komórce.

Mam nadzieję, ze teraz trochę jaśniej opisałem smile.gif


Nie wiedziałem, że wytłumaczenie dokładne o co chodzi jest takie trudne...
Go to the top of the page
+Quote Post
melkorm
post
Post #8





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


  1. SELECT m.name, GROUP_CONCAT(b.name) AS zespoly FROM musicans m INNER JOIN musicians_bands mb ON (m.id=mb.id) INNER JOIN bands b ON (b.id = mb.band_id) GROUP BY m.id


Nie testowałem winksmiley.jpg


--------------------
Go to the top of the page
+Quote Post
-Gość-
post
Post #9





Goście







Cytat(Gość @ 24.09.2008, 21:22:48 ) *
Dzięki za pomoc!

Widzę jednak, że sam sobie nie poradzę. A więc od początku. Ten przykład z publikacjami to był przykład, chciałem na nim dobrze opisać.

A więc mam trzy tabele:

musicians - w której przechowuję dane wszystkich muzyków
musicians_bands - w której przechowuję informacje o zespołąch, w jakich muzycy grali /jak wiadomo tego jest dużo, więc dlatego osobna tabela
bands - zawiera informacje i zespołach wszystkich.

Teraz:
Struktury tabel musicians i bands nie będę opisywał bo jest standardowa /id, name, etc./. Najważniejsza jest struktura tabeli musicians_bands:
  1. ID | BAND_ID | YEAR_F | YEAR_T

Najważniejsze są te dwa pola, id oraz band_id.
ID - to ID danego artysty, a BAND_ID to id danego zespołu /danych z dwóch poprzednich tabel/
Teraz pytanie: w jaki sposób sformułować zapytanie do bazy, aby wqyświetlał:
  1. Artysta 1 | Zespół 1, Zespół 2
  2. |
  3. --------------------------------------
  4. Artysta 2 |Zespół 3
  5. |
  6. --------------------------------------
  7. Artysta 3 | Zespół 1, Zespół 4
  8. |
  9. --------------------------------------


Czyli generalnie, żeby pobierał dane:
Wszystkie z tabeli musicians => wszystkie z tabeli musicians_bands => band_name z bands. Tylko, żeby wyplute wyniki z bands_musicians wyświetlał w jednej komórce.

Mam nadzieję, ze teraz trochę jaśniej opisałem smile.gif
Nie wiedziałem, że wytłumaczenie dokładne o co chodzi jest takie trudne...



Po drobych poprawkach działa, ale w dalszym ciągu wywala tylko jeden zespół, nawet jeśli jest ich więcej:(
Go to the top of the page
+Quote Post
melkorm
post
Post #10





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


Cytat
Po drobych poprawkach działa, ale w dalszym ciągu wywala tylko jeden zespół, nawet jeśli jest ich więcej:(


daj zrzut tych trzech tabel ... . najlepiej na phpfi.com smile.gif

P.S. jak testowałem u mnie na testowych tabelach to działało ;]


--------------------
Go to the top of the page
+Quote Post
-Gość-
post
Post #11





Goście







Proszę:)

http://phpfi.com/356703
Go to the top of the page
+Quote Post
melkorm
post
Post #12





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


dla zapytania:
  1. mysql> SELECT m.name, GROUP_CONCAT(b.band_name) AS zespoly FROM musicians m INNE
  2. R JOIN musicians_bands mb ON (m.id=mb.id) INNER JOIN bands b ON (b.id = mb.band_
  3. id) GROUP BY m.id;

wynik:
Kod
+--------+------------------+
| name   | zespoly                   |
+--------+------------------+
| muzyk1 | band1,434h43y43y |
+--------+------------------+


artysta i 2 zespoły :] oczywiście zespoły są wyświetlane po przecinku -> tu zastosować najlepiej explode jeżeli chcesz jeszcze coś z tym robić ;]


--------------------
Go to the top of the page
+Quote Post
-Gość-
post
Post #13





Goście







Cytat(melkorm @ 24.09.2008, 23:08:36 ) *
dla zapytania:
  1. mysql> SELECT m.name, GROUP_CONCAT(b.band_name) AS zespoly FROM musicians m INNE
  2. R JOIN musicians_bands mb ON (m.id=mb.id) INNER JOIN bands b ON (b.id = mb.band_
  3. id) GROUP BY m.id;

wynik:
Kod
+--------+------------------+
| name   | zespoly                   |
+--------+------------------+
| muzyk1 | band1,434h43y43y |
+--------+------------------+


artysta i 2 zespoły :] oczywiście zespoły są wyświetlane po przecinku -> tu zastosować najlepiej explode jeżeli chcesz jeszcze coś z tym robić ;]


Wszystko super, ale... powiedz mi jak do tego doszedłeś?! Faktycznie działa!!!

W sumie mój sposób - który wymyśliłem przed chwilą - też zadziałał biggrin.gif Tylko są to dwa zapytania biggrin.gif

Dzięki!!
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 Aktualny czas: 22.08.2025 - 11:36