=?iso-8859-2?q?SQL:_left_join:_dublowanie_wynik=F3w?=
Staszek27 - 22-08-2007 00:02
=?iso-8859-2?q?SQL:_left_join:_dublowanie_wynik=F3w?=
Witam! Mam mały problem przy łączeniu tabel poprzez LEFT JOIN i szczerze mówiąc, nie jestem w stanie go rozwiązać (chodzi o prostą galerię). Oto tabele: zdjecia: nazwa | opis kot | Jakiś kot je rybe pies | Czarny pies biegnie za autem tagi: nazwa | tag kot | zwierze kot | ryba pies | auto pies | pies oceny: nazwa | ocena kot | 6 // pies póki co nie ma ocen Chciałbym sobie wyciągnąć to tak by mieć wszystko w jednym wyniku: nazwa | tagi (wszystkie w jednym wierszu) | srednia ocena Rzucam takie zapytanie: SELECT zdjecia. * , AVG(oceny.ocena) AS ocena, GROUP_CONCAT(tagi.tag) AS tagi FROM `zdjecia` LEFT JOIN `oceny` ON zdjecia.nazwa=oceny.nazwa LEFT JOIN tagi ON zdjecia.nazwa=tagi.nazwa GROUP BY zdjecia.nazwa Co otrzymuję w zamian za moją ciężką pracę? nazwa | tagi (wszystkie w jednym wierszu) | srednia ocena kot | zwierze,ryba,zwierze,ryba | 6.0000 pies | auto,pies | NULL Proszę zauważyć, że oceniony kot ma zdublowane tagi (aż strach pomyśleć, co by było gdyby miał więcej ocen). Dlaczego tak się dzieje? Jak można temu zaradzić? Z góry dziękuję za pomoc, Stanisław Polański P.S. Próbowałem też użyć dwóch LEFT JOIN: SELECT zdjecia. * , AVG( oceny.ocena ) AS ocena, GROUP_CONCAT( tagi.tag ) AS tagi FROM `zdjecia` LEFT JOIN `oceny` ON zdjecia.nazwa = oceny.nazwa LEFT JOIN tagi ON zdjecia.nazwa = tagi.nazwa GROUP BY zdjecia.nazwa Rezultat: ten sam. Porzucenie LEFT JOIN skutkuje hecami gdy zdjęcie nie ma oceny
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 22-08-2007 00:02
Staszek27 wrote: > Witam! > Mam mały problem przy łączeniu tabel poprzez LEFT JOIN i szczerze > mówiąc, nie jestem w stanie go rozwiązać (chodzi o prostą galerię). > Oto tabele: > zdjecia: > nazwa | opis > kot | Jakiś kot je rybe > pies | Czarny pies biegnie za autem > tagi: > nazwa | tag > kot | zwierze > kot | ryba > pies | auto > pies | pies > oceny: > nazwa | ocena > kot | 6 > // pies póki co nie ma ocen
Tu chyba musi być więcej ocen kota, żeby był podany przez Ciebie efekt.
> Chciałbym sobie wyciągnąć to tak by mieć wszystko w jednym wyniku: > nazwa | tagi (wszystkie w jednym wierszu) | srednia ocena > Rzucam takie zapytanie: > SELECT zdjecia. * , AVG(oceny.ocena) AS ocena, GROUP_CONCAT(tagi.tag) > AS tagi FROM `zdjecia` LEFT JOIN `oceny` ON zdjecia.nazwa=oceny.nazwa > LEFT JOIN tagi ON zdjecia.nazwa=tagi.nazwa GROUP BY zdjecia.nazwa > Co otrzymuję w zamian za moją ciężką pracę? > nazwa | tagi (wszystkie w jednym wierszu) | srednia ocena > kot | zwierze,ryba,zwierze,ryba | 6.0000 > pies | auto,pies | NULL > Proszę zauważyć, że oceniony kot ma zdublowane tagi (aż strach > pomyśleć, co by było gdyby miał więcej ocen). Dlaczego tak się dzieje? > Jak można temu zaradzić? > Z góry dziękuję za pomoc,
Wywal GROUP BY, a zobaczysz dokładnie co się dzieje. Po prostu tak nie wolno robić.
Średnią ocen lub/i tagi grupuj w podzapytaniach, dzięki temu nie będą Ci się mnożyły rekordy.
-- P.M.
Staszek27 - 29-08-2007 00:11
=?iso-8859-2?q?Re:_SQL:_left_join:_dublowanie_wynik=F3w?=
Paweł Matejski napisał(a): > Wywal GROUP BY, a zobaczysz dokładnie co się dzieje. > Po prostu tak nie wolno robić. Nie da się. > Średnią ocen lub/i tagi grupuj w podzapytaniach, dzięki temu nie będą Ci się > mnożyły rekordy. Mógłbym prosić o jakąś wskazówkę? Bo kompletnie nie wiem jak się za to zabrać (z której strony ugryźć)? Gdyby każde zdjęcie miało oceny, to coś może bym wykombinował, ale tak to nie mogę ruszyć :( Dziękuję za odpowiedź, Pozdrawiam!
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 29-08-2007 00:43
Staszek27 wrote: > Paweł Matejski napisał(a): >> Wywal GROUP BY, a zobaczysz dokładnie co się dzieje. >> Po prostu tak nie wolno robić. > Nie da się. >> Średnią ocen lub/i tagi grupuj w podzapytaniach, dzięki temu nie będą Ci się >> mnożyły rekordy. > Mógłbym prosić o jakąś wskazówkę?
To była wskazówka. Tam gdzie teraz masz tabele we FROM wstawiasz podzapytanie. Zrób je tak, żeby zwracały nie więcej niż 1 wiersz na zdjecie.
> Bo kompletnie nie wiem jak się za to > zabrać (z której strony ugryźć)? Gdyby każde zdjęcie miało oceny, to > coś może bym wykombinował, ale tak to nie mogę ruszyć :(
A co to ma do rzeczy? Juz sobie z tym poradziłeś za pomocą LEFT JOIN.
P.S. A nie spróbowałeś zobaczyć co się dzieje po wyrzuceniu GROUP BY?
-- P.M.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Wydajność baz danych w zależności od poziomu izolacji ANSI/ISO
Czy zna (obsługuje) ktoś program Iso Draw ?
Jak =?windows-1250?Q?pobra=E6_szacowan=B9_wielko=9C=E6_zbiory_wy nikowego_w_MS?==?windows-1250?Q?_SQL_2005=3F?=
MYSQL - kodowanie w ISO-PL
strona plus baza w iso do utf-8
Kodowanie: z iso na utf
[oracle] - Oracle SQL Developer - co to jest SID?
MS Sql Server 2000 i Server 2003
[MS SQL + kontakty outlook]CZy kontakty moge być zewnętrzne?
[oracle] Baza danych do kursy Introduction to Oracle9i:PL/SQL ? Skąd ją pobrać ?
zanotowane.pldoc.pisz.plpdf.pisz.plown-team.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|