Rankingsystem Problem

  • Ich habe eine Rankingliste bei einem Browsergame von mir.
    Dort werden alle User die nicht gesperrt sind ausgelesen und nach Ihrem Geld absteigend sortiert.
    Jetzt möchte ich es so machen, dass wenn man auf einer Profilseite von einem User ist, oben sein Rank angezeigt wird.
    Nur weiß ich nicht wie ich das machen soll ohne das ich das Ranking in eine Extra DB-Tabelle speichere und per Cronjob alle paar minuten/stunden zu aktualisieren. Weil auf der Userseite soll nur vom aktuellen User das Ranking angezigt werden (zB: User123 - Platz: 56).
    Hat jemand eine Idee wie ich das machen kann? Am besten so das es einfach direkt ausgelsen wird und ständig aktuell ist.

    Hoffe ihr habt eine/mehrere Idee/n

    Don't follow me, I run into walls.

  • Du könntest die Anzahl derer auslesen die einen größeren Geldbetrag haben:

    SQL
    SELECT COUNT(*) FROM user WHERE geldbetrag > '". $usermoney . "' AND gesperrt = 0;

    Ich bin nicht sicher ob man das ganze noch + 1 rechnen muss, einfach mal testen...

    Gruß crAzywuLf :D

    6 Mal editiert, zuletzt von crAzywuLf (4. Dezember 2009 um 10:22)

  • Ja ich musste noch plus 1 rechnen, weil er sonst bei Platz 0 angefangen hätte.
    Ein Problem gibt es allerdings noch, wenn ich paar Leute hab, die den selben Betrag an Geld haben, dann werden sie beispielweiße beide mit Platz 5 angezeigt.
    In der rangliste kommen alle nach einander. Deswegen müsste es dann halt auch mit der rangliste an sich übereinstimmen.
    Hast du eine Idee wie ich das machen kann, damit jeder seinen rang hat wie es auch auf der rangliste steht.
    So siehts momentan aus auf den entsprechenden Profilseiten:
    Platz 1 - Spieler 1 - 500€
    Platz 2 - Spieler 2 - 400€
    Platz 3 - Spieler 3 - 300€
    Platz 4 - Spieler 4 - 200€
    Platz 5 - Spieler 5 - 100€
    Platz 5 - Spieler 6 - 100€
    Platz 5 - Spieler 7 - 100€
    Platz 5 - Spieler 8 - 100€

    Spieler 5-8 sollten eigentlich den rang 5,6,7 und 8 haben anstatt alle 5...

    :/ Hoffe das ist irgendwie zu beheben.
    Danke schonmal du hast mir schonmal geholfen :)

    Don't follow me, I run into walls.

  • Du könntest mal probieren die User nach Geldbetrag und User ID sortieren

    SQL
    SELECT COUNT(*) FROM user WHERE geldbetrag > '". $usermoney . "' AND id < '" . $userid . "' AND gesperrt = 0;

    Das gleiche müsstest dann auf der Übersichtsseite auch machen quasi

    SQL
    SELECT a,b,c FROM user ORDER BY geldbetrag DESC, id ASC LIMIT ...;

    EDIT:
    Mal davon abgesehen, wieso willst du keinen Cronjob benutzen? Große Browsergames benutzen fast alle Cronjobs, weil es einfach nicht so serverlastig ist. Es gibt ja auch kostenlose Cronjobs, die könntest du z.B. auch benutzen, falls dein Webservice dir keine Cronjobs stellt.

    Gruß crAzywuLf :D

    2 Mal editiert, zuletzt von crAzywuLf (4. Dezember 2009 um 11:33)

  • Mein Server stellt sie mir nur gegen Bares^^
    Ja ich weiß das es die kostenlos gibt. Aber eine Serverlast ist das auch...
    Weil du musst bedenken. Die Rangliste sollte oft aktualisiert werden weil spieler sehen wollen wo sie stehen und das möglichst schnell.
    Und dann bleibt mir nur die möglichkeit die cronjobs in 5 Minuten abschnitten zu schalten. Und das heißt alle 5 Minuten ein Update der datenbank
    Ich werd das was du gepostet hast mal probieren.

    //EDIT:
    Klappt leider nicht so wie es sollte :/

    Don't follow me, I run into walls.

    Einmal editiert, zuletzt von MyXoToD (4. Dezember 2009 um 11:58)


  • //EDIT:
    Klappt leider nicht so wie es sollte :/

    Mein Lösungsvorschlag war noch nicht so ganz durchdacht probiers mal so, falls du es jetzt überhaupt noch brauchst^^:

    SQL
    SELECT COUNT(*) FROM user WHERE bargeld > '" . $usermoney ."' OR (bargeld = '" . $usermoney ."' AND id < '" . $userid ."') AND gesperrt = 0;

    Mit meiner Testtabelle funktionierte es und der 2 Query klappt auch ;)

    Zitat


    Ja ich weiß das es die kostenlos gibt. Aber eine Serverlast ist das auch...

    Nunja, ob jetzt alle 5 Minuten ein Script mal alles durchrechnet oder ob 30 Leute in der Sekunde eine Seite aufrufen die ein relativ teures SQL Statement abschießen, macht schon ein Unterschied... Muss man halt immer abwägen...

    Gruß crAzywuLf :D

    2 Mal editiert, zuletzt von crAzywuLf (4. Dezember 2009 um 12:43)

  • Hm jetzt steht beim Profil des ersten Platz 1
    beim zweiten-vierten steht Platz 5
    beim fünften Platz 6
    und beim rest Platz 7
    Oo
    Insgesamt 12 Spieler (Spiel ist noch nciht online deswegen :D alles testuser^^)

    Don't follow me, I run into walls.

  • Ich denke ich belasse es so, jeder der jetzt gleich ist, der hat auch den sleben rank, ist auch eigentlich gut so. Also alle die den selben geldbetrag haben sind auf dem selben platz.
    Danke für die Hilfe :)

    Don't follow me, I run into walls.

  • Du könntest schönheitshalber einmal nach denen Suchen die mehr haben und dann nochmal extra schauen ob es doppelte Einträge gibt - wenn ja kannst du diese zählen und z.B. Rank 5-8 schreiben lassen.