PDA

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!