Seite 1 von 1

SQL und Rangliste erzeugen

Verfasst: 09.01.2007 15:03
von [BUZ]
Hallo,

ich möchte für Sportseite eine Rangliste erzeugen. Dazu habe ich eine Tabelle spieler in folgender (vereinfachter) Form:

personId | Punkte | Rang
-----------------------------
1567 | 123 | 1
1568 | 101 | 2
1569 | 99 | 3
1570 | 87 | 4
1571 | 87 | 4
1572 | 22 | 5

Jetzt möchte ich per SQL einer Person Punkte geben und gegebenfalls die Ränge neu berechen ohne alle Persohnen per PHP abzuackern.

Mein Lösungsansatz in etwa:
- aktuelle_Punkte zur Person aus DB holen
- neue_Punkte = aktuelle_Punkte + x, berechnen
- prüfen ob weitere Personen mit aktuelle_Punkte in DB
- prüfen ob weitere Personen mit neue_Punkte in DB

folgende Möglichkeiten abarbeiten (a, b, c, d):

a.) Einfacher Rang aktuelle_Punkte UND einfacher Rang neue_Punkt
UPDATE spieler SET punkte=neue_Punkte WHERE personId='whatever';
UPDATE spieler SET rang=rang+1
WHERE punkte < neue_Punkte AND punkte > aktuelle_Punkte;

b.) Doppelter Rang aktuelle_Punkte UND einfacher Rang neue_Punkt
usw...

c.) Einfacher Rang aktuelle_Punkte UND doppelter Rang neue_Punkt
usw...

d.) Doppelter Rang aktuelle_Punkte UND doppelter Rang neue_Punkt
usw..

Hat jemand für das Problem etwas in der Schublade oder kennt jemand einen schlaueren Weg?

Gruß

Verfasst: 09.01.2007 17:09
von OnFire
Hi

ich würde hier den Rang gar nicht speichern, den kann man sehr einfach aus den Punkten berechnen (bei der Ausgabe der Rangliste) z.B. mit ORDER BY Punkte DESC im MySQL-Query ;)

Gruß
OnFire

Verfasst: 09.01.2007 18:44
von phillip
das DESC wird wohl heisen, von der grössten Zahl abwärts, stimmts?

Verfasst: 09.01.2007 18:59
von Pyramide
Ja

Verfasst: 15.01.2007 13:13
von [BUZ]
@OnFire:
Das geht leider nicht. Die Rangliste ist nicht nur ein "einfaches" sortieren und durchzählen. Siehe Rang 4! Gleiche Punkte bedeuten auch gleicher Rang. Geil wäre sogar: Rang: 1, 2, 3, 4, 4, 6 ...
Das Rangvergeben per PHP ist keine Lösung (dauert zu lang). Die Ränge nicht zu speicher bedeutet, sofern ich einem Spieler seinen Rang anzeigen möchte, muss ich bis zu seiner Position zählen (umständlich, dauert zu lang)... :cry:

Gruß