Pogčedajte punu verziju : Max() + Group By + ...
mega023
30. 09. 2011., 19:55
Pozdrav svima...
Mucim se sa jednim banalnim mysql upitom
Tabela izgleda otprilike ovako:
'id', 'id_autora', 'naziv_knjige, 'cena' ....
Meni trebaju sve najskuplje knjige za svakog autora...
Dakle group by id_autora obavezan...
Ako stavim SELECT max(cena) vraca mi najvecu cenu ali ne i ispavan naziv knjige i ID. Pobao sam i sa HAVING MAX(cena) to vraca nesto nevezano...
SELECT * FROM knjige GROUP BY id_autora HAVING MAX (cena)
Moze mala pomoc ... ?
Hvala unapred
jablan
30. 09. 2011., 20:05
Radi li ovo:
SELECT k1.*
FROM knjige k1
LEFT JOIN knjige k2 ON k1.id_autora = k2.id_autora AND k2.cena > k1.cena
WHERE k2.id IS NULL
mega023
30. 09. 2011., 20:18
hvala jablan-e
radi ali je dosta sporo... (1-3 sekunde da izvrsi komandu)
ako neko zna neko brze resenje neka javi...
(pretpostavljam upotrebom max(cena) a ne k2.cena > k1.cena...)
eksperimentisacu malo i sam...
jablan
30. 09. 2011., 20:41
Kako ti je indeksirana tabela?
mega023
30. 09. 2011., 20:46
primary key id
index bio na id_knjiga...
dodao i na cena...
radi malo brze ali opet u proseku dosta...
webarto
30. 09. 2011., 20:46
a ovo?
SELECT MAX(cena) FROM knjige GROUP BY id_autora ORDER BY cena DESC
pardon, nisam pročitao da treba i naslov...
jablan
30. 09. 2011., 20:50
@webarto: Tako dobije samo cene, ne i knjige.
@mega: Treba ti index (id_autora, cena DESC).
mega023
30. 09. 2011., 21:10
izvini mislio sam id_autor a ne id_knjiga...
moja greska...
jablan
30. 09. 2011., 21:20
^ Ovo što sam predložio je jedan, složeni indeks, ne dva.
cvele
30. 09. 2011., 21:57
Oko indeksiranja za join u jablanovom primeru: http://hackmysql.com/case4
mega023
30. 09. 2011., 22:55
^ Ovo što sam predložio je jedan, složeni indeks, ne dva.
probao sam i to...
ima napretka ali i dalje preko 1s...
srdjan
01. 10. 2011., 00:07
A ovo?
SELECT
id, id_autora, id_knjige, cena
FROM
knjige a
WHERE
knjiga_id = (SELECT b.id_knjige FROM knjige b
WHERE a.id_autora = b.id_autora
ORDER BY b.cena DESC LIMIT 1)
GROUP BY
id_autora
mega023
01. 10. 2011., 01:34
@srdjan: radi ali mi se cini da je sporije od jablanovog resenja...
jablan
01. 10. 2011., 09:02
Evo probao sam kod sebe sa oko ~50k recorda, tačno je da je sporo.
Ovo kod mene radi dosta brže (postgres):
select k1.*
from autori a
inner join knjige k1 on a.id = k1.id_autora and k1.id = (
select id
from knjige k2
where k2.id_autora = a.id
order by cena desc
limit 1
) order by a.id
mega023
01. 10. 2011., 09:54
@jablan: ovo je najbrze resenje do sada. Hvala puno!
vBulletin® v3.6.8, Copyright ©2000-2024, Jelsoft Enterprises Ltd.