GreenBeret
Mitglied
hallo. ich arbeite an einer PHP-Online Liga für einen egoshooter.
bisher funktionierte es so, dass es eine tabelle für die user und eine für die matches gab. die user hatten standardgemäß 1000 punkte, und wenn einer ein match gewonnen hatte, wurde die usertabelle geupdated und dann stand in seiner usertabelle eben z.B. 1004 punkte. die rankingseite zu machen war dann unkompliziert, einfach die benötigten infos der "user"tabelle selektieren und "ORDER BY POINTS" machen.
ich möchte das system aber ändern, und zwar dass nun nicht mehr die nach jedem match neu fest gelegten punkte eingetragen werden sondern ich habe mir eine funktion gebaut, die in der matches tabelle nachschaut wieviele spiele der spieler gespielt hat, wieviele und wie hoch gewonnen hat und demnach die gesamtpunktzahl des spielers berechnet wird. Ich könnte problemlos eine funktion bauen die z.B. "get_playerpoints($userID)" heisst und für die userIDs die punkte ermittelt.
(ich mache das deshalb so, da evtl gespielte matches, die aber ungültig waren z.B. wegen cheatens gelöscht werden könnten, und der admin dann immer dem user manuell die beim match errungenen punkte abziehen müsste)
leider hätte ich dann das problem, dass ich bei der rankingsanzeige nicht mehr "order by points" angeben muss, da dieser wert eigentlich garnicht mehr existiert (und auch nicht mehr relevant ist). habt ihr eine idee wie man es trotzdem hinbekommen könnte ? das problem liegt ja darin dass erstmal für alle user der punktestand ermittelt werden muss, und dann eine sortierung erfolgen muss
um es gleich vorwegzunehmen: es ist leider nicht möglich über irgendwelche SQL Tricks, wie left join o.ä. dies hinzubekommen, das habe ich schon probiert und es hat nicht wirklich geklappt. ich möchte euch nun noch kurz ein paar felder in der tabelle matches aufzeigen:
- challenger_userid, challended_userid
- challenger(ed)_score_map1(2) => das sind einfach die mapergebnisse
- winner_id, loser_id
- challenger(ed)_points_difference - die anzahl der rankingpunkte die bei diesem match für den challenger/challenged spieler hinzugekommen sind.
die ranking-punkte werden nach dem ELO system berechnet (infos dazu findet man z.B. bei wikipedia). d.h. es kann auch sein dass man punkte erhält obwohl man das spiel verloren oder draw gespielt hat.
meine bisherige theoretische lösungsmethode sieht so aus:
- alle IDs aus der membertabelle holen. für jede ID mittels einer selbst gebauten funktion die gesamtpunktzahl errechnen. d.h. ich hole alle matches aus der matches tabelle bei denen userID = challenger_userid ist und addiere dann alle challenger_points_diff werte und mache dasselbe mit userID = challened_userid.
- das ganze funktioniert über while($fetch = mysql_fetch_array($sql))... - ich muss dann in dieser whileschleife, nachdem die punkte-funktion für jede ID die punkte herausgefunden hat diese auch irgendwie speichern, also z.B. in einem mehrdimensionalen array.
- dann muss z.B. das array sortiert werden, also nach den rankingpunkten - relevant ist aber dann letztendlich nicht nur der punktestand sondern v.a. auch die userid, ich muss also eine sortierung haben die mir sagt welche userID am meisten punkte hat, welche am zweitmeisten usw
- über eine foreach schleife verarbeitet die bereits sortierte userID-abfolge. es wird dann für jede ID der datensatrz geholt und die ergebnisse auf der seite angezeigt.
ist das soweit richtig ? wenn ja, dann bräuchte ich auf jeden fall hilfe wie das mit der erstellung und sortierung des mehrdimensionalen arrays gehen kann. ich habe gesehen dass es einige sort-funktionen gibt, aber diese löschen den index, der bei mir ja die userID wäre, und genau das kann ich nicht gebrauchen da der index (also die userID) das ist was ja entscheidend ist!
MfG
bisher funktionierte es so, dass es eine tabelle für die user und eine für die matches gab. die user hatten standardgemäß 1000 punkte, und wenn einer ein match gewonnen hatte, wurde die usertabelle geupdated und dann stand in seiner usertabelle eben z.B. 1004 punkte. die rankingseite zu machen war dann unkompliziert, einfach die benötigten infos der "user"tabelle selektieren und "ORDER BY POINTS" machen.
ich möchte das system aber ändern, und zwar dass nun nicht mehr die nach jedem match neu fest gelegten punkte eingetragen werden sondern ich habe mir eine funktion gebaut, die in der matches tabelle nachschaut wieviele spiele der spieler gespielt hat, wieviele und wie hoch gewonnen hat und demnach die gesamtpunktzahl des spielers berechnet wird. Ich könnte problemlos eine funktion bauen die z.B. "get_playerpoints($userID)" heisst und für die userIDs die punkte ermittelt.
(ich mache das deshalb so, da evtl gespielte matches, die aber ungültig waren z.B. wegen cheatens gelöscht werden könnten, und der admin dann immer dem user manuell die beim match errungenen punkte abziehen müsste)
leider hätte ich dann das problem, dass ich bei der rankingsanzeige nicht mehr "order by points" angeben muss, da dieser wert eigentlich garnicht mehr existiert (und auch nicht mehr relevant ist). habt ihr eine idee wie man es trotzdem hinbekommen könnte ? das problem liegt ja darin dass erstmal für alle user der punktestand ermittelt werden muss, und dann eine sortierung erfolgen muss
um es gleich vorwegzunehmen: es ist leider nicht möglich über irgendwelche SQL Tricks, wie left join o.ä. dies hinzubekommen, das habe ich schon probiert und es hat nicht wirklich geklappt. ich möchte euch nun noch kurz ein paar felder in der tabelle matches aufzeigen:
- challenger_userid, challended_userid
- challenger(ed)_score_map1(2) => das sind einfach die mapergebnisse
- winner_id, loser_id
- challenger(ed)_points_difference - die anzahl der rankingpunkte die bei diesem match für den challenger/challenged spieler hinzugekommen sind.
die ranking-punkte werden nach dem ELO system berechnet (infos dazu findet man z.B. bei wikipedia). d.h. es kann auch sein dass man punkte erhält obwohl man das spiel verloren oder draw gespielt hat.
meine bisherige theoretische lösungsmethode sieht so aus:
- alle IDs aus der membertabelle holen. für jede ID mittels einer selbst gebauten funktion die gesamtpunktzahl errechnen. d.h. ich hole alle matches aus der matches tabelle bei denen userID = challenger_userid ist und addiere dann alle challenger_points_diff werte und mache dasselbe mit userID = challened_userid.
- das ganze funktioniert über while($fetch = mysql_fetch_array($sql))... - ich muss dann in dieser whileschleife, nachdem die punkte-funktion für jede ID die punkte herausgefunden hat diese auch irgendwie speichern, also z.B. in einem mehrdimensionalen array.
- dann muss z.B. das array sortiert werden, also nach den rankingpunkten - relevant ist aber dann letztendlich nicht nur der punktestand sondern v.a. auch die userid, ich muss also eine sortierung haben die mir sagt welche userID am meisten punkte hat, welche am zweitmeisten usw
- über eine foreach schleife verarbeitet die bereits sortierte userID-abfolge. es wird dann für jede ID der datensatrz geholt und die ergebnisse auf der seite angezeigt.
ist das soweit richtig ? wenn ja, dann bräuchte ich auf jeden fall hilfe wie das mit der erstellung und sortierung des mehrdimensionalen arrays gehen kann. ich habe gesehen dass es einige sort-funktionen gibt, aber diese löschen den index, der bei mir ja die userID wäre, und genau das kann ich nicht gebrauchen da der index (also die userID) das ist was ja entscheidend ist!
MfG