[SQL/CF]Highscore bepalen welke rank een speler heeft

Pagina: 1
Acties:

  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
Ik ben bezig een spel te bouwen met behulp van coldfusion en Microsoft SQL server en ik zit met het volgende probleem. Aan het eind van het spel is het leuk om een highscore te zien, maar daar sta je lang niet altijd in omdat je niet meteen heel goed bent. Ik laat nu dus wel een top 10 zien maar wil ook laten zien op welke plek de speler geeindigt is (bijv. 525ste). Ik doe het op het moment door gewoon alle scores te sorteren en dan met een loop langs alle resultaten gaan net zolang tot ik bij de game_id ben van het laatst gespeelde spel. Dit gaat goed bij een paar honderd gespeelde spellen, maar als het er meer dan 1000 worden schiet dit niet op. Wat ik dus eigenlijk wil is met behulp van een query gelijk de behaalde plek van een speler op kunnen vragen zonder een eindeloze loop te gebruiken.

Zoiets als:
code:
1
2
3
<cfquery name="ranking" datasource="db_spel">
      SELECT rank FROM game_info WHERE game_id = '10' ORDER BY score DESC;
</cfquery>


maar rank is dan dus geen kolom in de tabel. Deze manier werkt dus niet, maar zoiets zou ik dus willen heeft iemand enig id hoe ik dit moet oplossen?

http://www.slobmotorsport.nl - iRacing Profiel


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
code:
1
2
3
4
5
SELECT *, 
     (SELECT COUNT(*) +1 FROM game_info 
      WHERE score > g.score) as Rank 
FROM game_info g 
WHERE game_id = '10'


Let wel dat dit qua performance niet een geweldige oplossing is.

[ Voor 10% gewijzigd door P_de_B op 19-05-2004 11:07 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

Defineer in de tabel de game-id als secundaire index... Dat maakt het zoeken wat sneller :)

Forget your fears...
...and want to know more...


  • Blizard
  • Registratie: September 2001
  • Niet online
Kan je even een beetje meer toelichting geven over je model ?! ...
Is een aanpassing in de database uberhaupt mogelijk ? Of is dat uitgesloten ?

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
P_de_B schreef op 19 mei 2004 @ 11:06:
code:
1
2
3
4
5
SELECT *, 
     (SELECT COUNT(*) +1 FROM game_info 
      WHERE score > g.score) as Rank 
FROM game_info g 
WHERE game_id = '10'


Let wel dat dit qua performance niet een geweldige oplossing is.
Waarom niet? Er is toch maar één record met game_id = '10'? En dat betekent dat de subquery maar voor één record uitgevoerd hoeft te worden.

Het alternatief is om mbv een trigger steeds de juiste rank bij te werken.

[ Voor 4% gewijzigd door cameodski op 19-05-2004 11:24 ]

Never underestimate the power of


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
cameodski schreef op 19 mei 2004 @ 11:24:
[...]

Waarom niet? Er is toch maar één record met game_id = '10'? En dat betekent dat de subquery maar voor één record uitgevoerd hoeft te worden.
.
Je hebt gelijk :)
@TS: dit is niet geweldig qua performance indien je bijv. de rank van alle games wilt berekenen.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
ok bedankt het is gelukt :) ik heb het op P_de_B zijn manier gedaan werkt perfect en ik hoef maar 1 rank binnen te halen dus het gaat lekker snel.

http://www.slobmotorsport.nl - iRacing Profiel

Pagina: 1