ďťż
 
mysql: left join group by order by - problem z sortowaniem ďťż
 
mysql: left join group by order by - problem z sortowaniem
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

mysql: left join group by order by - problem z sortowaniem



bogo - 26-09-2007 00:05
mysql: left join group by order by - problem z sortowaniem
  Witam,
mam tabele:
gallery (id, name)
photo (id, gallery_id, name, created_at)

teraz chcę za pomocą jednego zapytania wyświetlić wszystkie galerie
oraz ostatnie zdjęcie dodane do galerii.

Przyszło mi do głowy następujące zapytanie:

select p.id, p.title, p.created_at, ga.id, ga.name from photo p LEFT
JOIN gallery ga ON (p.gallery_id = ga.id) GROUP BY ga.id ORDER BY
p.created_at desc;
(można zrobić jako pierwszą tabelę gallery - ale to nie rozwiązuje
problemu sortowania)

w wyniku otrzymuje prawie to co chcę. Problem w tym, że nie jest
posortowane po p.created_at, ponieważ ORDER BY robi sortowanie na
wyniku z GROUP BY.

Jak zrobić aby działało? Chciałbym uniknąć zapytań zagnieżdżonych.

Dzięki





wojteb@gmail.com - 27-09-2007 00:09

  On 25 Wrz, 17:10, bogo <bogo...@tlen.pl> wrote:
> Witam,
> mam tabele:
> gallery (id, name)
> photo (id, gallery_id, name, created_at)
>
> teraz chcę za pomocą jednego zapytania wyświetlić wszystkie galerie
> oraz ostatnie zdjęcie dodane do galerii.

Żeby miec 100% pewności:

SELECT g.*, p2.*
FROM gallery AS g, photo AS p1, photo AS p2
WHERE g.id = p1.gallery_id AND max(p1.id) = p2.id
GROUP BY p1.gallery_id

to będzie chyba to, może się wywalić na składni i może będziesz musieć
uzyc aliasu zamiast: max(p1.id)

IDEA:
pobierasz wszystkie dane (pełne)
grupujesz po galerii
z danej galerii wybierasz najnosze zdjecie (przy założeniu że nowsze
nie trafiają w miejsca po kluczach)

czyli w tym miejscu masz ID galerii i ID najnowszego zdjęcia

A teraz do tak powstałej tabeli dołączasz tabele z infem o zdjęciach,
gdzie warunkiem złączenia jest że id poprzednio wybranego zdjęcia ma
się zgadzać z id zdjęcia dołączanego

> Jak zrobić aby działało? Chciałbym uniknąć zapytań zagnieżdżonych.

Czemu? Takie coś powinno dać się uruchomić:

SELECT * FROM gallery AS g , (SELECT * FROM photo WHERE id IN(SELECT
MAX(id) AS id2 FROM photo GROUP BY gallery_id)) AS p2 WHERE g.id =
p2.gallery_id;

A teraz dla obu zapytań wywołaj EXPLAIN'a i porównaj wyniki

pBT




=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 27-09-2007 00:09

  wojteb@gmail.com wrote:
> On 25 Wrz, 17:10, bogo <bogo...@tlen.pl> wrote:
>> Witam,
>> mam tabele:
>> gallery (id, name)
>> photo (id, gallery_id, name, created_at)
>>
>> teraz chcę za pomocą jednego zapytania wyświetlić wszystkie galerie
>> oraz ostatnie zdjęcie dodane do galerii.
>
> Żeby miec 100% pewności:
>
> SELECT g.*, p2.*
> FROM gallery AS g, photo AS p1, photo AS p2
> WHERE g.id = p1.gallery_id AND max(p1.id) = p2.id
> GROUP BY p1.gallery_id
>
> to będzie chyba to, może się wywalić na składni i może będziesz musieć
> uzyc aliasu zamiast: max(p1.id)

Pomyśl, warunek where jest wykonywany na konkretnym rekordzie. Skąd ma baza wiedzieć przy
pierwszym rekordzie, jaki jest max(id)?

--
P.M.




wojteb@gmail.com - 27-09-2007 00:09

  On 26 Wrz, 15:09, Paweł Matejski <ma...@spam.madej.pl.eu.org> wrote:
> woj...@gmail.com wrote:

> Pomyśl, warunek where jest wykonywany na konkretnym rekordzie. Skąd ma baza wiedzieć przy
> pierwszym rekordzie, jaki jest max(id)?

racja

> > SELECT g.*, p2.*
> > FROM gallery AS g, photo AS p1, photo AS p2
> > WHERE g.id = p1.gallery_id
HAVING max(p1.id) = p2.id
> > GROUP BY p1.gallery_id





=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 27-09-2007 00:09

  wojteb@gmail.com wrote:
> On 26 Wrz, 15:09, Paweł Matejski <ma...@spam.madej.pl.eu.org> wrote:
>> woj...@gmail.com wrote:
>
>> Pomyśl, warunek where jest wykonywany na konkretnym rekordzie. Skąd ma baza wiedzieć przy
>> pierwszym rekordzie, jaki jest max(id)?
>
>
> racja
>
>>> SELECT g.*, p2.*
>>> FROM gallery AS g, photo AS p1, photo AS p2
>>> WHERE g.id = p1.gallery_id
> HAVING max(p1.id) = p2.id
>>> GROUP BY p1.gallery_id

Dalej źle.... zobacz na jakiej zasadzie podstawiana jest wartość do kolumna nie wymienionych w klauzuli
GROUP BY.

--
P.M.




wojteb@gmail.com - 28-09-2007 00:11

  On 26 Wrz, 17:15, Paweł Matejski <ma...@spam.madej.pl.eu.org> wrote:
> woj...@gmail.com wrote:
> > On 26 Wrz, 15:09, Paweł Matejski <ma...@spam.madej.pl.eu.org> wrote:
> >> woj...@gmail.com wrote:
>
> >> Pomyśl, warunek where jest wykonywany na konkretnym rekordzie. Skąd ma baza wiedzieć przy
> >> pierwszym rekordzie, jaki jest max(id)?
>
> > racja
>
> >>> SELECT g.*, p2.*
> >>> FROM gallery AS g, photo AS p1, photo AS p2
> >>> WHERE g.id = p1.gallery_id
> > HAVING max(p1.id) = p2.id
> >>> GROUP BY p1.gallery_id
>
> Dalej źle.... zobacz na jakiej zasadzie podstawiana jest wartość dokolumna nie wymienionych w klauzuli
> GROUP BY.
>

A taki wałek!
Przeanalizuj jeszcze raz i zobacz gdzie określasz warunek połączenia z
tabelą p2.
Nigdzie?
Więc co dostaniesz, nie jest to przypaskiem kartezjan?
Jak nie wierzysz to wykonaj te zapytanie bez HAVING

Pozdro, pBT




=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 28-09-2007 00:11

  wojteb@gmail.com wrote:
> On 26 Wrz, 17:15, Paweł Matejski <ma...@spam.madej.pl.eu.org> wrote:
>> woj...@gmail.com wrote:
>>> On 26 Wrz, 15:09, Paweł Matejski <ma...@spam.madej.pl.eu.org> wrote:
>>>> woj...@gmail.com wrote:
>>>> Pomyśl, warunek where jest wykonywany na konkretnym rekordzie. Skąd ma baza wiedzieć przy
>>>> pierwszym rekordzie, jaki jest max(id)?
>>> racja
>>>>> SELECT g.*, p2.*
>>>>> FROM gallery AS g, photo AS p1, photo AS p2
>>>>> WHERE g.id = p1.gallery_id
>>> HAVING max(p1.id) = p2.id
>>>>> GROUP BY p1.gallery_id
>> Dalej źle.... zobacz na jakiej zasadzie podstawiana jest wartość do kolumna nie wymienionych w klauzuli
>> GROUP BY.
>>
>
> A taki wałek!
> Przeanalizuj jeszcze raz i zobacz gdzie określasz warunek połączenia z
> tabelą p2.
> Nigdzie?
> Więc co dostaniesz, nie jest to przypaskiem kartezjan?

Przed GROUP by owszem. Ale po GROUP BY dostajesz już tylko po jednym rekordzie
na każdy gallery_id! Więc porównujesz max z bliżej nieokreśloną wartością!

> Jak nie wierzysz to wykonaj te zapytanie bez HAVING

Albo przeczytaj dokumentacje, albo sam spróbuj. Ja dokumentacje czytałem! Nie muszę
wykonywać zapytania. Tym bardziej, że jest to przypadek kiedy zapytanie czasem działa
a czasem nie!

Mamy photo:

id gallery_id
1 1
2 1
3 2
4 2

W wyniku zapytania, bez HAVING otrzymujejmy (wywalam gallery, bo tu jest nieistotna):

gallery_id p1.id p2.id
1 2 ?
2 4 ?

Co się znajdzie pod pytajnikami, Ty wiesz, bo ja nie wiem. Ale najważniejsze jest, że może
znaleźć sie tylko jedna wartość! A HAVING działa po GROUP BY...

--
P.M.




sash668 - 29-09-2007 00:00

  bogo <bogo123@tlen.pl> in
news:1190733046.597186.193920@d55g2000hsg.googlegr oups.com wrote:

> [...] Chciałbym uniknąć zapytań zagnieżdżonych.

Jakieś konkretne przeciwskazania czy "widzi mi się"? Z podzapytaniem
to chwila :-).

--
Best regards
sash668
na dżimejl dot kom
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?= [mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?= [MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?= [mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?= [MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?= [MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?= Gdzie MySQL 4.1, a gdzie 5.0? [MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?= [MS SQL] "set names" (mySQL) w MS SQL [mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • kfia-tek.keep.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com