Archief - MYSQL: Plaats in klassement

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Cycloon

Legacy Member
Ik ben op zoek naar een systeem om je plaats in een klassement te kunnen bepalen, en dat liefst via MySQL.

Stel de database ziet er zo uit:

ID | Naam | Score

Nu staan die scores dus willekeurig. Als ik die eerst laat sorteren van groot naar klein en ik lees dan de naam uit van een speler, hoe kan ik dan zijn plaats in het klassement bepalen? Is er een manier om dit via een MySQL commando te doen (tis voor een webpagina, dus alles moet via PHP gebeuren)?

Natuurlijk kan ik een heel idiote work-around doen door de hele database uit te lezen, via php in een tabel te steken en dan kijken op welke plaats die persoon staat, maar dat lijkt me vrij omslachtig en vrij zwaar. Of zou dit toch de enige mogelijkheid zijn?

Ik hoop dat iemand begrijpt wat ik bedoel :p

Logion

Legacy Member
Ik zou volgende query runnen:
SELECT COUNT(*) as ranking FROM table WHERE score >= $score;

$score zijnde de score van de persoon in kwestie

Dno of dit zwaar is maar ik zie geen andere mogelijkheid zonder een extra veld aan de tabel toe te voegen.

Cycloon

Legacy Member
Logion zei:
Dno of dit zwaar is maar ik zie geen andere mogelijkheid zonder een extra veld aan de tabel toe te voegen.

En wat is de mogelijkheid als er wel een extra veld toevoegbaar is? Want ik zie niet wat een extra veld zou kunnen oplossen :confused:

Lord Kveldulv

Legacy Member
De ranking hebt ge toch als ge sorteert op score? Als ge sorteert van groot naar klein dan is de eerste da ge uitleest de nr 1 in ranking ect.
Of bedoelt ge dat ge er maar ene naam wilt uitpikken ipv alles te overlopen?
Kzou dan sorteren, alles opvragen, maar in php ne if zetten die de naam vergelijkt en alleen die naam toont en dan hebt ge meteen ook de ranking.
Zwaar of niet is niet aan de orde met slechts een handvol, of zelfs een paar honderd records :)

Logion

Legacy Member
Vind mijn oplossing nog altijd beste, dan moet ge natuurlijk eerst aan de score geraken van de gebruiker in kwestie maar das peanuts.
Met dat extra veld bedoelde ik gewoon dat je daar de ranking inzet, deze update je dan 1x per dag ofzo.(heeft wel nadelen; zoals geen live ranking, een extra veld)

Neem gwn mijn count query, hier de query in 1 keer dmv. een subquery (vind ik wel niet zo leesbaar maar bon)
SELECT COUNT(*) as ranking FROM table WHERE score >= (SELECT score FROM table WHERE ID=$userID);
Nu geef je gewoon de ID van gebruiker mee, en je krijgt de ranking terug.

Cycloon

Legacy Member
Lord Kveldulv zei:
Zwaar of niet is niet aan de orde met slechts een handvol, of zelfs een paar honderd records :)

Binnen enkele maanden zouden dat duizenden records kunnen zijn die heel regelmatig worden opgevraagd, en dan werkt zo'n systeem niet optimaal. Maar ik ga logion z'n code eens testen, dat lijkt wel deels een goede oplossing te zijn (alleszins beter dan alle records altijd in te laden).

killgore

Legacy Member
Kijken wat er meer nodig is: hoeveelste je staat en hoeveel keer die rankings worden aangepast.

Als dat laatste beduidend minder is dan dat eerste sla je de ranking mee op in de db en herreken je die elke keer als je score aanpast.

edit: en je kan eventueel zoals veel webgames doen en maar om het kwartier - half uur ranking laten herrekenen ;).

Lashknife

Legacy Member
kzou dan toch aan logion een distinct toevoegen, anders krijg je zoiets als "ik ben 75ste van de 100" maar eigenlijk deel ik een gedeelde 36ste plaats... (maar je hebt met die * alle dubbels opgehaald en meegeteld...)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan