[ Tyler Durden @ 15.02.2011. 09:45 ] @
Naslov nije baš najsretniji ali ništa bolje mi nije palo na pamet.

Problem je prost (bar mi se čini) ali ja sam zakucao i ne mogu da provalim.
Treba da izvučem podatke iz par tabela, od kojih iz jedne tabele treba da izvučem samo red (i jedan podatak iz njega) gdje je i max(id) za korisnik_id preko koga spajam tu tabelu.
E, sve radi osim toga. Ja dobijem prvi unos iz te tabele za taj korisnik_id, a treba mi posljednji.

Code (sql):

SELECT username, pa_jos_kolona_iz_drugih_tabela, cena (za ovo mi treba cena iz posljednjeg unosa MAX(id))
FROM
tabele razno razne
WHERE
razno razni uslovi i spajanje tih tabela
GROUP BY username;
 


Nadam se da ovo nije previše apstraktno opisano i da može da se skapira šta me muči.
[ kiklop74 @ 15.02.2011. 14:51 ] @
Help ti lepo kaze sledece:

Citat:

If you use GROUP BY, output rows are sorted according to the GROUP BY columns as if you had an ORDER BY for the same columns.
To avoid the overhead of sorting that GROUP BY produces, add ORDER BY NULL:


Zbog toga moras prvo da napravis prost query gde sortiras vrednosti po max(id) tj order by id desc pa zatim da uradis select iz tog rezultat grupisan po polju user iliti otprilike ovako:

Code:

select a.user,a.cena from 
   (SELECT user,c.cena FROM user u, cenovnik c order by c.id desc) a 
group by ime order by NULL;


[ bogdan.kecman @ 15.02.2011. 23:54 ] @
primer:

Code:

SELECT t1.f1, t1.f2, t1.f3, t2.f1, t2.f2, t3.f1
FROM t1, t2, t3
WHERE
t1.f1 > t2.f1 AND
t1.f3 > 10 AND
t3.f1 = 'xyz' AND

t2.f2 = (SELECT MAX(t4.id) FROM t4)

ORDER BY t1.f1 DESC;


jasno?

ovo ti "spaja" t1, t2 i t3 tako da ti je t2.f2 = taj max() koji si hteo ... to sto si napisao ti je ovaj upit, ako si hteo nesto drugo - napisi bolje objasnjenje sta hoces da izvedes
[ Tyler Durden @ 16.02.2011. 09:05 ] @
Ali meni treba to za svakog korisnika.
Evo konkretno, tabela korisnici u kojoj se nalazi username i neki standardni podaci o korisniku, i tabela kupljene_knjige u kojoj se nalazi svaka knjiga koju je do sada kupio taj korisnik kao i cijena te knjige.
Meni treba da vratim sve podatke o korisniku korisnici.* i posljednju knjigu koju je uzeo taj korisnik zajedno sa cijenom te knjige.
Nadam se da je sad malo jasnije :-)
[ djoka_l @ 16.02.2011. 09:42 ] @
Pretpostavimo da tabela korisnici ima kolone ID i USERNAME, a kupljene knjige imaju ID, USERID (onoga koji je kupio knjigu) i CENA

Onda je kod:

Code (sql):

SELECT u.*, x.*
FROM korisnici u,  (
   SELECT id, userid, cena
   FROM kupljene_knjige k, (
      SELECT MAX(id) id, userid
      FROM kupljene_knjige
      GROUP BY userid) m
   WHERE k.id = m.id) x
WHERE u.id = x.userid
 


Naravno, u upitu gde spajaš korisnike sa ugnežđenim upitom možeš da staviš OUTER JOIN ako te interesuju i korisnici koji nisu kupili knjigu.
[ Tyler Durden @ 16.02.2011. 12:32 ] @
Bravo, to je to ;-)
[ bogdan.kecman @ 16.02.2011. 16:38 ] @
btw, obrati samo paznju da ne koristis nikakve blobove, text-ove ili varchar-ove preko 255 karaktera u ovakvim upitima posto ce znacajno zabosti performanse (pravice se temp tabele na disku umesto u ramu)