Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Rozwiązany][MySQL]Zagnieżdżone zapytanie?
Forum PHP.pl > Forum > Przedszkole
robos85
Mam problem jak napisać zapytanie.
Mam:
tabelę utwory (id, nazwa)
tabelę utwor_instrument (id, utwor_id, instrument_id)
tabelę instrumenty (id, nazwa)

W 1 zapytaniu chciałbym pobrać listę wszystkich utworów wraz z instrumentami. Jak mam takie zapytanie skonstruować? Zapewne jako śJOIN użyć ale nie mam pomysłu jak.
phpion
Cytat(robos85 @ 25.11.2009, 14:47:23 ) *
Zapewne jako śJOIN użyć ale nie mam pomysłu jak.

Masz rację, JOIN. Jaki? Zapewne LEFT JOIN (o ile może być utwór bez instrumentu). Jeżeli masz problem z napisaniem takiego zapytania (a jest to naprawdę prosty JOIN) to poczytaj manual MySQL. Znajdziesz tam przykłady, dzięki którym sklecisz coś własnego. W razie problemów pytaj (podając swoje dotychczasowe rozwiązanie).
darko
  1. SELECT u.nazwa, i.nazwa, FROM utwory u, instrumenty i, utwor_instrument ui WHERE ui.utwor_id=u.id AND ui.instrument_id=i.id


questionmark.gif

Pobierze wszystkie nazwy utworów i instrumentów powiązane z tabelą utwor_instrument
robos85
tylko, że 1 utwór może mieć np 15 instrumentów i tu mam problem. Chciałbym w polu instrumenty (dla każdego utworu) mieć jakoś listę tych instrumentów. Jeżeli utwór miałby mieć tylko 1 utwór to nie mam z tym problemu. Problemem jest ta cała lista jakoś w JOIN
thek
Polecam użycie w jednym zapytaniu: LEFT JOIN, GROUP BY, group_concat winksmiley.jpg

EDIT: w zalezności czy chcesz mieć id instrumentu czy jego nazwę to po prostu jest jedno mniej lub więcej left join i wsio smile.gif
maly_swd
  1. SELECT u.nazwa, group_concat( i.nazwa) AS instrumenty
  2. FROM utwory u
  3. JOIN utwor_instrument ui ON ui.utwor_id=u.id
  4. JOIN instrumenty i ON i.instrument_id=i.id
  5.  
  6. GROUP BY u.id
robos85
Cytat(maly_swd @ 25.11.2009, 13:59:55 ) *
  1. SELECT u.nazwa, group_concat( i.nazwa) AS instrumenty
  2. FROM utwory u
  3. JOIN utwor_instrument ui ON ui.utwor_id=u.id
  4. JOIN instrumenty i ON i.instrument_id=i.id
  5.  
  6. GROUP BY u.id


Ale to zapytanie nie podaje mi wszystkich instrumentów tylko 1
darko
Cytat
W 1 zapytaniu chciałbym pobrać listę wszystkich utworów wraz z instrumentami.


Jak wszystkich, to wszystkich:

  1. SELECT u.*, i.*, FROM utwory u, instrumenty i


smile.gif
robos85
Wszystkich w sensie - wszystkich przydzielonych w danym utworze.
thek
Chłopak... swd się rypnął w drugim z join... Łączył joinem dwa razy tabelę I zamiast UI smile.gif Zmień tam jedno I na UI a wszystko zadzierga smile.gif
EDIT... Tu jest błąd smile.gif
  1. JOIN instrumenty i ON i.instrument_id=i.id
Ma dwa i zamiast jedno ui a drugie i. A ma być
  1. JOIN instrumenty i ON ui.instrument_id=i.id

EDIT2: Poza tym jego zapytanie jest właśnie tym o czym mówiłeś. A co ja wspomniałem z swd ponad 20 minut temu tylko nie zauważyłeś tej małej literówki.
EDIT 3 ( biggrin.gif ): @bottom: u mnie poszedł do domu 2h temu bo mu się dziś śpieszyło winksmiley.jpg Ja podobnie jak Ty takie zapytania już "przetwarzam" w głowie bo łeb prawie jak walidator bazy biggrin.gif Takie literówki łapię w locie, tylko nieco inaczej mi się to przetwarza winksmiley.jpg
maly_swd
thek-> dzinx, cos takiego chyba powinno dzialac:) nie mam czasu sprawdzic bo szef biega po biurze;)
robos85
Tamtą literówkę zauważyłem i sam poprawiłem;)
Mam więc takie zapytanie:
  1. SELECT `m`.*, `u`.`username`, `m2i`.`instrumentid`, `i`.`instrument`, `tl`.`length`
  2. FROM `s4b_musicfiles` AS `m`
  3. LEFT JOIN `s4b_users` AS `u` ON m.userid = u.id
  4. LEFT JOIN `s4b_music2instrument` AS `m2i` ON m.id = m2i.musicid
  5. LEFT JOIN `s4b_instruments` AS `i` ON i.id = m2i.instrumentid
  6. LEFT JOIN `s4b_tracklength` AS `tl` ON m.length = tl.id
  7. WHERE (accepted ='1')
  8. GROUP BY `m`.`id`


printowanie `i`.`instrument` daje mi tylko 1 wynik (a powinno być kilka) czyli tak jak pisałem:/
thek
To ja się pytam... Gdzie zgubiłeś group_concat? Bo ja go w Twoim zapytaniu nie widzę.
robos85
  1. SELECT `m`.*, `u`.`username`, `m2i`.`instrumentid`, GROUP_CONCAT(i.instrument) AS `instrumentslist`, `tl`.`length`
  2. FROM `s4b_musicfiles` AS `m`
  3. LEFT JOIN `s4b_users` AS `u` ON m.userid = u.id
  4. LEFT JOIN `s4b_music2instrument` AS `m2i` ON m.id = m2i.musicid
  5. LEFT JOIN `s4b_instruments` AS `i` ON i.id = m2i.instrumentid
  6. LEFT JOIN `s4b_tracklength` AS `tl` ON m.length = tl.id
  7. WHERE (accepted ='1')
  8. GROUP BY `m`.`id`

Z tego co widzę działa tak jak chciałem. Do dziś nie słyszałem o funkcji GROUP_CONCAT smile.gif

Dzięki za pomoc:)

EDIT:
Odświeżam, żeby zapytać jeszcze o kolejną rzecz. Tamto zapytanie było OK, dodałem do niego podobna formułę dla 2giej tabeli - nastrój. Zapytanie wygląda teraz tak:
  1. SELECT `m`.*, `u`.`username`, `m2i`.`instrumentid`, GROUP_CONCAT(i.instrument SEPARATOR ', ') AS `instrumentslist`, `m2m`.`moodid`, GROUP_CONCAT(mo.mood SEPARATOR ', ') AS `moodlist`, `tl`.`length`
  2. FROM `s4b_musicfiles` AS `m`
  3. LEFT JOIN `s4b_users` AS `u` ON m.userid = u.id
  4. LEFT JOIN `s4b_music2instrument` AS `m2i` ON m.id = m2i.musicid
  5. LEFT JOIN `s4b_instruments` AS `i` ON i.id = m2i.instrumentid
  6. LEFT JOIN `s4b_music2mood` AS `m2m` ON m.id = m2m.musicid
  7. LEFT JOIN `s4b_mood` AS `mo` ON mo.id = m2m.moodid
  8. LEFT JOIN `s4b_tracklength` AS `tl` ON m.length = tl.id
  9. WHERE (accepted ='1')
  10. GROUP BY `m`.`id`


I w wynikach jest teraz pomieszane. Wszystkie instrumenty i wpisy są pokazywane po kilka razy:/
thek
Dzieje się tak, ponieważ masz grupowanie po instrumencie, a Ty próbujesz jeszcze po nastroju, który nie jest grupowany i stąd masz zamieszanie. Group concat zaś działa tylko na elementy zgrupowane.
robos85
wewnątrz group_concat dałem distinct w obydwu przypadkach. Załatwiło sprawę.
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.