Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Problem z zapytaniem
Forum PHP.pl > Forum > Przedszkole
Gość
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
melkorm
  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ść
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
melkorm
  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ść
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?
melkorm
  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.
Gość
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...
melkorm
  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ść
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:(
melkorm
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ść
Proszę:)

http://phpfi.com/356703
melkorm
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ść
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!!
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.