[SQL] Leuk query vraagstuk

Pagina: 1
Acties:

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
Hoi, ik dacht om het SQL niveau wat omhoog te krijgen, de volgende vraag (ik heb het antwoord zelf al bedacht, en de gebruikte techniek vind ik erg grappig)

Stel we hebben een tabel met 3 velden:

forumid(int) - userid(int) - postcount(int)
----------PK----------

Deze tabel cached de post-count van alle users per forum. Dus bv een user heeft 312 posts gemaakt in P&W, 56 in HK, etc.

Nu willen we hier een leuk grafiekje van maken. Per forum willen we een staafdiagram met de top10 posters (dus de 10 users met het meest aantal posts in een forum).
Er is maar ruimte voor maximaal 10 staafjes, en omdat we geen gebruikers voortrekken (yeah right ;)) zullen we soms minder dan 10 staafjes afbeelden als de onderste gebruikers allemaal dezelfde postcount hebben. In dat geval zouden we dus mensen hebben die gedeelt 10e zijn, en meer dan 10 staafjes nodig hebben, wat dus niet kan. Overigens is het geen enkel probleem om bv gedeelt 3e te zijn, zolang er maar maximaal 10 users zijn en er geen "random" beslissingen worden genomen.

Nu de vraag: Geef een query (eentje dus, geen unions of subqueries oid, alla mysql) om de benodigde data op te halen voor alle fora. Niet meer (!), niet minder. We krijgen dus maximaal 10*count(fora) rows terug. En per fora tussen de 0 en 10 (0 als bv alle 11+ users 1 post hebben)

[ Voor 0% gewijzigd door Zoijar op 04-10-2002 11:10 . Reden: PK streepje liep te ver door ]


Verwijderd

Misschien iets met distinct oid

select forumid, distinct userid, postcount from tabel order by postcount ASC limit 0,10

[ Voor 0% gewijzigd door Verwijderd op 04-10-2002 11:28 . Reden: limit vergeten ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
edit:
ok

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
he, geen hints geven he, dat is niet leuk :)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je zult het waarsch toch met meerdere queries op moeten lossen (per forum eentje) dus denk dat je net zo goed nog wat extra checks in je code kan plaatsen.

En dan is het gewoon een heel simpele select...

  • mklerx
  • Registratie: April 2000
  • Laatst online: 24-07 10:58
Ik heb hem, kan ik hem mailen? Blijft het ook nog leuk voor de rest....

  • jochemd
  • Registratie: November 2000
  • Laatst online: 25-08 15:35
SQL:1999 of ook nog niet standaard extensies?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
mklerx schreef op 04 oktober 2002 @ 13:44:
Ik heb hem, kan ik hem mailen? Blijft het ook nog leuk voor de rest....
Yep, dat is hem :) _/-\o_ hehe

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:05
Is de oplossing nog enigszins netjes, of worden er allemaal features van MySQL misbruikt?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
Hij is heel (vrij) netjes, allemaal standaard sql, geen vage functies oid, gewoon select, from, where, etc

  • djazete
  • Registratie: Juli 1999
  • Laatst online: 07-02-2020

djazete

steel

wanneerkomt de oplossing ?? :) (liever lui dan moe.. als dat een geldige reden is, ben ook wel benieuwd) :+

Verwijderd

En de koelkast gaat naar.....mklerx?

Nou maak je ons wel nieuwschierig, dus tijd voor de oplossing..

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Zoijar schreef op 05 oktober 2002 @ 03:45:
Hij is heel (vrij) netjes, allemaal standaard sql, geen vage functies oid, gewoon select, from, where, etc

En ook efficient? :)

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
Ok, hier is ie dan ;)

SELECT t1.forumid, t1.userid, t1.postcount
FROM tblcnt AS t1, tblcnt AS t2
WHERE
t1.postcount <= t2.postcount AND
t1.forumid = t2.forumid
GROUP BY t1.forumid, t1.userid, t1.postcount
HAVING COUNT(*) <= 10
ORDER BY t1.forumid ASC, t1.postcount DESC

Als je nu denkt "heh :? " ga dan is na hoe het precies werkt, ik vind het prachtig hehe :)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

En nou de efficientie?
Volgens mij is het sneller om per forum die counts op te halen dan deze vrij complexe query (ja, deze is voor mysql al redelijk complex ;) )

Zal niet voor elk dbms gelden, in postgres is de kans groot dat deze query veel sneller is...

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
In mysql is deze zeker sneller, omdat je anders count(forumid) losse queries moet uitvoeren. Maar daar ging het eigenlijk niet om :) Was zo maar voor de lol

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Zoijar schreef op 05 oktober 2002 @ 18:05:
In mysql is deze zeker sneller, omdat je anders count(forumid) losse queries moet uitvoeren.
Heb je het getest of denk je dat? ;)
Losse queries gebruiken is zeker geen argument waarom iets _perse_ slomer is.
Zeker bij mysql niet.
Maar daar ging het eigenlijk niet om :) Was zo maar voor de lol

Dat snap ik :)
Pagina: 1