Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Rozwiązany][MySQL]Zagnieżdżone zapytanie?
robos85
post 25.11.2009, 13:47:23
Post #1





Grupa: Zarejestrowani
Postów: 466
Pomógł: 11
Dołączył: 21.09.2006
Skąd: Szczecin

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


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.

Ten post edytował robos85 25.11.2009, 17:21:39
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
phpion
post 25.11.2009, 13:50:55
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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).
Go to the top of the page
+Quote Post
darko
post 25.11.2009, 13:53:36
Post #3





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


  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


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
robos85
post 25.11.2009, 13:55:18
Post #4





Grupa: Zarejestrowani
Postów: 466
Pomógł: 11
Dołączył: 21.09.2006
Skąd: Szczecin

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


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
Go to the top of the page
+Quote Post
thek
post 25.11.2009, 13:57:52
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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

Ten post edytował thek 25.11.2009, 14:00:40


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
maly_swd
post 25.11.2009, 13:59:55
Post #6





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


  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


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
robos85
post 25.11.2009, 14:16:08
Post #7





Grupa: Zarejestrowani
Postów: 466
Pomógł: 11
Dołączył: 21.09.2006
Skąd: Szczecin

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


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
Go to the top of the page
+Quote Post
darko
post 25.11.2009, 14:18:04
Post #8





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
robos85
post 25.11.2009, 14:21:34
Post #9





Grupa: Zarejestrowani
Postów: 466
Pomógł: 11
Dołączył: 21.09.2006
Skąd: Szczecin

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


Wszystkich w sensie - wszystkich przydzielonych w danym utworze.
Go to the top of the page
+Quote Post
thek
post 25.11.2009, 14:24:52
Post #10





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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

Ten post edytował thek 25.11.2009, 14:36:53


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
maly_swd
post 25.11.2009, 14:30:00
Post #11





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


thek-> dzinx, cos takiego chyba powinno dzialac:) nie mam czasu sprawdzic bo szef biega po biurze;)


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
robos85
post 25.11.2009, 16:02:58
Post #12





Grupa: Zarejestrowani
Postów: 466
Pomógł: 11
Dołączył: 21.09.2006
Skąd: Szczecin

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


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:/
Go to the top of the page
+Quote Post
thek
post 25.11.2009, 16:07:32
Post #13





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




To ja się pytam... Gdzie zgubiłeś group_concat? Bo ja go w Twoim zapytaniu nie widzę.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
robos85
post 26.11.2009, 10:48:24
Post #14





Grupa: Zarejestrowani
Postów: 466
Pomógł: 11
Dołączył: 21.09.2006
Skąd: Szczecin

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


  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:/

Ten post edytował robos85 25.11.2009, 16:20:53
Go to the top of the page
+Quote Post
thek
post 26.11.2009, 11:40:32
Post #15





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.

Ten post edytował thek 26.11.2009, 11:41:12


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
robos85
post 26.11.2009, 11:42:44
Post #16





Grupa: Zarejestrowani
Postów: 466
Pomógł: 11
Dołączył: 21.09.2006
Skąd: Szczecin

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


wewnątrz group_concat dałem distinct w obydwu przypadkach. Załatwiło sprawę.
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: 14.08.2025 - 09:46