[SQL] Enkel de grootste per id

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zit ff met klein probleempje, maar volgens de mensen in de koffiehoek groot genoeg om topic van te maken. Ik heb een vote systeem waarmee je per challenge op een bepaalde style kan voten(styles staan in aparte tabel ofc). Nu wil ik per challenge het challenge_id en de style_id, naam en shortcode van de meest gevote style hebben.
Zo ver ben ik gekomen:
SQL:
1
2
3
4
select sv.challenge_id AS cid, count(*) as cnt, sv.style_id, st.stylename, st.styleshortcode
from stylevote AS sv, style AS st
where sv.style_id=st.style_id
group by sv.style_id , st.styleName , st.styleShortCode, sv.challenge_id

Hier krijg ik echter nog bijvoorbeeld zoiets terug:
345;1;2;"FullSpeed";"fs"
345;2;1;"Tech";"t"

Dus 2 styles van een challenge, eentje daarvan heeft 1 vote(fullspeed) en 1 heeft er 2(Tech). Ik wil dus dat ie alleen maar Tech zou teruggeven en die hele fullspeed row er niet inzit. Met LIMIT werken heeft geen zin want er zitten natuurlijk meerdere challenges in de database. Ook wil ik niet voor iedere challenge een aparte query gaan uitvoeren, dus, hoe doe ik dit? :P

Oh, en mocht het uitmaken: ik gebruik postgresql als database

Acties:
  • 0 Henk 'm!

  • TommyGun
  • Registratie: Mei 2004
  • Laatst online: 08-09 22:55

TommyGun

Stik er maar in!

Subquery in de WHERE met http://www.techonthenet.com/sql/max.php ?

“In a world without walls and fences, who needs Windows and Gates".


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dit lijkt me een klassiek groupwise maximum/groupwise max probleempje. Welke oplossing het beste is hangt van je postgresql-versie af, maar [google=groupwise maximum postgresql] geeft oa PostgreSQL: Selecting records holding group-wise maximum over versie 8.4. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • roeleboel
  • Registratie: Maart 2006
  • Niet online

roeleboel

en zijn beestenboel

met limit heeft wel zin als je het zo zou doen (pseudo-code):

order by cnt DESC LIMIT 1

(dus sorteren van hoog naar laag op je count(*), en daarvan enkel de eerste rij geven.

of dat dit qua performance/onderhoudbaarheid een mooie oplossing is weet ik niet, daar zou ik wel graag commentaar over zien :)
(voorbeeld is trouwens enkel gegeven/bedacht omdat ie zei dat limit geen zin had)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
roeleboel schreef op dinsdag 04 mei 2010 @ 16:48:
met limit heeft wel zin als je het zo zou doen (pseudo-code):

order by cnt DESC LIMIT 1

(dus sorteren van hoog naar laag op je count(*), en daarvan enkel de eerste rij geven.

of dat dit qua performance/onderhoudbaarheid een mooie oplossing is weet ik niet, daar zou ik wel graag commentaar over zien :)
(voorbeeld is trouwens enkel gegeven/bedacht omdat ie zei dat limit geen zin had)
Uhm, als ik die doe krijg ik dus maar 1 rij terug ;). Ook al heb ik 100 challenges. Snap je? Ik dacht eerst ook zoiets te doen en dan ipv LIMIT 1 een limit op aantal banen. Het probleem daarmee is dat als 1 baan op style 1 4 votes heeft en op style 2 3. En een andere baan alleen op style 1 2 votes dan komt die andere baan er niet meer in voor

Ben nu naar die van pedorus aan het kijken, maar heb 'm nog niet helemaal door XD

EDIT:
Heb 'm denk ik:
SQL:
1
2
3
4
5
6
SELECT dd.cid, dd.style_id, dd.stylename, dd.styleshortcode FROM
(select sv.challenge_id AS cid, count(*) as cnt, sv.style_id, st.stylename, st.styleshortcode, DENSE_RANK() OVER (PARTITION BY sv.challenge_id ORDER BY COUNT(*) DESC) AS dr
from stylevote AS sv, style AS st
where sv.style_id=st.style_id
group by sv.style_id , st.styleName , st.styleShortCode, sv.challenge_id) AS dd
WHERE dd.dr = 1

Bedank!

[ Voor 40% gewijzigd door Verwijderd op 04-05-2010 17:01 ]