[PHP] Realtime ranglijst...

Pagina: 1
Acties:

  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Ik kom helaas niet uit het volgende probleem:

Voor een online game-league is er een tabel met daarin alle punten, ID van de speler en de plaats in de ranglijst.

Als je speelt kun je punten verdienen. Als de speler waarvan je wint ver boven je staat verdien je meer punten. In de tabel moet dus ook je 'plaats' op de ranglijst goed bijgehouden worden.

Als iemand bijvoorbeeld 5 punten omhoog gaat en daardoor 3 plaatsen zou stijgen zou ik alle spelers onder hem 1 omlaag moeten zetten....hoe kan ik dit het beste aanpakken... :?

Mocht het te vaag zijn dan hoor ik het wel :P

..geen script-request, maar gewoon een vraag om wat hulp...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Mischien is het handiger om die ranglijsten dynamisch te genereren (dwz niet vast opslaan in de DB).

Je kunt de rangpositie wel updaten met een set pos=pos+1 where pos < x AND pos > y om alle posities tussen y en x een plek op te schuiven, maar dan kun je snel last krijgen van race problemen.

Waarschijnlijk kun je beter met scores werken (vervang 'iemand die hoger/lager staat' door 'iemand met een hogere/lagere score' in je beschijving van de puntentelling)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Op dinsdag 18 juni 2002 21:19 schreef Janoz het volgende:
Mischien is het handiger om die ranglijsten dynamisch te genereren (dwz niet vast opslaan in de DB).
Ok, maar hoe weet ik iemand zn plaats dan?
Je kunt de rangpositie wel updaten met een set pos=pos+1 where pos < x AND pos > y om alle posities tussen y en x een plek op te schuiven, maar dan kun je snel last krijgen van race problemen.
race problemen wil ik voorkomen, dus dit valt af :P
Waarschijnlijk kun je beter met scores werken (vervang 'iemand die hoger/lager staat' door 'iemand met een hogere/lagere score' in je beschijving van de puntentelling)
Hoe bedoel je dit :?

  • flat
  • Registratie: Mei 2000
  • Niet online
gewoon elke keer als iemand z'n puntenaantal verandert, opnieuw sorteren en rangnummers toekennen
die rangnummers opslaan, en daarvan gebruik maken als je de volgende keer gaat updaten

lijkt mij de simpelste manier

"Happiness is a way of travel, not a destination."
--Roy Goodman


  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Op dinsdag 18 juni 2002 21:37 schreef Flat© het volgende:
gewoon elke keer als iemand z'n puntenaantal verandert, opnieuw sorteren en rangnummers toekennen
die rangnummers opslaan, en daarvan gebruik maken als je de volgende keer gaat updaten

lijkt mij de simpelste manier
Kan je MySQL een tabel laten sorteren en aan de hand van dat 'volgordenummering' opslaan zeg maar :?

Hoe zou dat gaan :?

  • leonardo1504
  • Registratie: April 2001
  • Niet online
Ik snap het probleem niet. Volgens mij moet je de plaatsen op de ranglijst helemaal niet in je tabel bijhouden. Je plaats op de lijst wordt toch bepaald door het aantal punten dat je hebt? Dan kan je met een query altijd sorteren op het aantal punten dat je hebt. Bovendien kan je van elke persoon het aantal personen met meer punten ook querieen (WHERE punten > $punten oid) en dat plus 1 is dus iemand zijn rangnummer.

  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Op dinsdag 18 juni 2002 21:46 schreef leonardo1504 het volgende:
Ik snap het probleem niet. Volgens mij moet je de plaatsen op de ranglijst helemaal niet in je tabel bijhouden. Je plaats op de lijst wordt toch bepaald door het aantal punten dat je hebt? Dan kan je met een query altijd sorteren op het aantal punten dat je hebt. Bovendien kan je van elke persoon het aantal personen met meer punten ook querieen (WHERE punten > $punten oid) en dat plus 1 is dus iemand zijn rangnummer.
Nee, stel ik heb iemand met 322 punten die op nr 1 staat.

De nr 55 met 12 punten wint van de nr 1. Dan krijgt hij extra punten omdat hij iemand heeft verslagen die 50 of meer plaatsen boven hem staat.

Je moet dus iemand zijn rangplaats weten.

En dat kun je volgens mij niet query'en...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Zoals ik al zei, je kunt simpel het rangnummer dynamisch bepalen.. Gewoon iets met SELECT SUM(* ) FROM USERS WHERE SCORE>eigen score ofzo...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Op dinsdag 18 juni 2002 22:01 schreef Janoz het volgende:
Zoals ik al zei, je kunt simpel het rangnummer dynamisch bepalen.. Gewoon iets met SELECT SUM(* ) FROM USERS WHERE SCORE>eigen score ofzo...
Ok, ik ga ff iets uitwerken.

Misschien kan het topic nog ff openblijven, hopelijk zijn er nog mensen met andere briljante ideeen :P :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Waarom zou het dicht moeten? Ik zie niks in strijd met 1 of andere regel oid...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Op dinsdag 18 juni 2002 22:08 schreef Janoz het volgende:
Waarom zou het dicht moeten? Ik zie niks in strijd met 1 of andere regel oid...
Ik heb wel is het gevoel dat de mod's zoveel mogelijk dicht doen...

Ook andere topics, waaronder een paar van mijzelf gaan soms met een hele absurde reden dicht...vandaar dat ik het maar ff voor de zekerheid netjes vroeg.. :)

Verwijderd

En met iets als een temporary table? een soort INSERT ... SELECT dus...?

Verwijderd

Als je nou toch eens views kon gebruiken..... tsja

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:54
Een basisregel bij het ontwerpen van databasestructuren is om alleen die gegevens op te slaan die je absoluut nodig hebt. Indirecte gegevens, die uit die essentiële gegevens af te leiden zijn, dienen niet in de databaselayout terug te komen.

Een uitzondering hierop vormt een situatie waarin de prestatie van je applicaties onacceptabel veel afneemt. De kans dat je je in zo'n situatie bevind is echter erg klein. De nadelen die het ontwerpen voor prestaties met zich mee brengt zijn meestal de voordelen niet waard.

Op deze manier kom je dus bij Janoz' suggestie uit. De plaats op de ranglijst is af te leiden uit het puntenaantal en zou dus niet afzonderlijk opgeslagen worden. Het is niet zo moeilijk om queries te vinden om te sorteren op positie en om de positie van een zekere rij in de ranglijst te vinden.
Pagina: 1