moin moin ...
ich hab mal wieder eine frage ...
ich schreib grad für meinen schwager nen programm ... das ergebnisse von turnieren in ner mysql-db speichert ...
wenn ich nun bei einem spieler den punktestand erhöhe ... soll mein programm automatisch berechnen auf welchem platz der spieler dann stehen würde ...
sprich .. ich hab grad nen lösungsansatzfindungsproblem ...
ich weiß grad nicht wie ich das realisieren soll ... und ich komm partout auf keine lösung ...
vielleicht hat ja jemand von euch ne idee für nen lösungsansatz ...
thx & grüßle
frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)
mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb
Hi seth,
ich würde es wahrscheinlich so machen:
Alle Spieler-Objekte befinden sich in einer Liste, die nach dem Punktestand sortiert ist. Zum Sortieren kann man ArrayList.Sort verwenden. Als Parameter übergibt man einen selbst geschriebenen PunktestandComparer, der Spieler nach ihrer Punktestand-Eigenschaft vergleicht.
Der Index eines Spielers in der Liste entspricht dann seiner Platzierung.
Um einen Spieler mit einem gewissen Punktestand einzufügen, kann man ArrayList.BinarySearch zusammen mit dem PunktestandComparer verwenden. Als Ergebnis wird der Index zurückgegeben, an dem der Spieler eingefügt werden muss. Die Methode kann auch zur Ermittlung der Platzierung verwendet werden (oder jeder Spieler speichert seine Platzierung in einer Eigenschaft).
Gruss
Pulpapex
das ausrechnen der reihenfolge wäre auch komplett in einem sql-statement lösbar. sql kann vieles 🙂
Du kannst das Ergebnis deiner SQL anfrage sortieren lassen:
[php]$sql = "SELECT * FROM Turnier
ORDER BY Punktestand ASC"[/php]
danke für die schnellen antworten 😉 ...
werds mir anschauen ...
das sortieren der datenbank is ja kein problem .. läuft alles wunderbar ... das problem der plazierungsumsortierung tritt halt immer nach neuen turnieren auf ... wenn die spieler neue punkte dazubekommen ... mancheiner bekommt keine ... und so ändern sich die platzierungen halt immer 😉
grüßle
frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)
mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb
du musst halt beim inserten den neuen punktestand ausrechnen. und wenn du das query nach puntke sortierst, hast du immer die richtige reihenfolge... ich versteh dein problem nicht!
@.unreal ... ich mach keine inserts sondern updates ... das heißt in den datensätzen gibts immer schon den punktestand
frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)
mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb
SELECT * FROM teilnehmer ORDER BY punkte DESC LIMIT 0,10
Das holt dir die punktbesten 10 Teilnehmer aus der Datenbank. Da die Sortierung erst bei Abfrage erfolgt (und nicht einmalig wie du zu denken scheinst) werden vorherige Updates der Punkte natürlich mitberücksichtigt 🙂
Etwas nicht tun zu können, ist kein Grund etwas nicht zu tun.
-Alf
das ist auch nicht das was ich machen will ...
ich habe in der tabelle schon die platzierungen stehen ... zum beispiel ...
platz 1 ... name ... turniere ... punkte ...
wenn der spieler nun auf platz 5 steht und durch einen sieg zum beispiel soviele punkte sammelt das er danach auf platz 2 stehen wird ... das ist was ich machen möchte ..
vielleicht hab ich mich oben ja falsch ausgedrückt ... aber das anzeigen und sortieren der tabelle ist nicht das problem ... das funktioniert einwandfrei ...
ich will eben bloß wenn ich den spieler ein paar punkte dazuaddiere mit meinem programm seine neue platzierung herausfinden ... und dann den datensatz des spielers updaten (mit den neuen punkten (kein problem) und der neuen platzierung (das zu berechnen ist mein problem)... (auch das updaten ist kein problem ... funktioniert ebenfalls problemlos) mir gehts nur um die vorgehensweise zur berechnung der neuen platzierung (deswegen steht mein thread ja auch nicht bei datentechnologien 😉 ) ...
grüßle
frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)
mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb
Fehlt dir die Logik oder die Technik?
(mir würde die Technik fehlen, daher hier mal die Logik)
// SELECT id FROM teilnehmerTabelle ORDER BY punkte DESC
ArrayList teilnehmer = // kenne den Befehl nicht zum schreiben aller id's der Datensätze in eine ArrayList
string sqlUpdate = "";
for (int i = 0; i < teilnehmer.Count; i++)
{
sqlUpdate += "UPDATE teilnehmerTabelle SET rang = " + (i+1) + " WHERE id = " + teilnehmer[i] + " LIMIT 1;";
}
// in sqlUpdate steht jetzt der SQL-Befehl zum Update der Tabelle
Aber dies ist schlechter Stil! Es kann zu widersprüchlichen Aussagen innerhalb der Daten kommen (nämlich wenn Admin B mal die Idee hat die Punkteanzahl per Hand zu ändern, dann stimmt die Punktzahl solange nicht mehr mit der Platzierung überein, bis ein Platzierungs-Update erfolgt).
Also bitte vorher das hier lesen: Wikipedia:Normalisierung (Datenbank)
Edit: Was spricht denn überhaupt gegen ein Echtzeit-Berechnen der Platzierung?
Etwas nicht tun zu können, ist kein Grund etwas nicht zu tun.
-Alf
mir fehlte der denkansatz 😉 ... die idee sozusagen wie ichs überhaupt anpacke ...
ich werd mich mit deiner idee mal beschäftigen ... danke 🙂 ...
frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)
mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb
Um meine Programmierlösung in Worte zu fassen:
Hole alle eindeutigen IDs der Teilnehmer aus der Datenbank, absteigend sortiert nach Punkten.
Durchlaufe die IDs (Array index 0 = Platz 1, index 1 = Platz 2, ..) und schreibe pro ID einen SQL-Befehl, nämlich
// pseudocode
UPDATE tabelle SET platzierung = index + 1 LIMIT 1
..da sich die Platzierung ja nach dem index der herausgefischten Datensätze berechnet.
Aber wie gesagt, das ist schlechter Stil. Wahrscheinlich willst du aber auch mal einen Teilnehmer aus der Datenbank herausholen und sofort seine Platzierung wissen (natürlich wäre es da toll, die Platzierung stände schon in einer Zelle drinne). Das könntest du aber auch mit zwei schnellen SQL-Befehl herausfinden
// sagen wir du willst den Teilnehmer Peter
SELECT name, punkte FROM tabelle WHERE name = 'Peter' LIMIT 1
// ok Peter hat 5100 Punkte
// dan schreib den SQL Befehl
SELECT COUNT(*) FROM tabelle WHERE punkte > 5100
das Ergebnis ist eine Zahl, nämlich die Anzahl aller Teilnehmer die mehr Punkte haben als Peter und durch diese 2 wirklich schnellen Befehle (mit LIMIT 1 und COUNT) hast du die Platzierung eines einzelnen Teilnehmers ermittelt. Ich an deiner Stelle würde also die Platzierung per SQL errechnen, das gehört dann aber wohl nicht mehr ins Forum.
Hoffe ich habe dich jetzt nicht komplett falsch verstanden bzw. dir ein bißchen weitergeholfen 🙂
Etwas nicht tun zu können, ist kein Grund etwas nicht zu tun.
-Alf
Hallo seth,
nach allem Gesagten, es wäre eine Überlegung wert, die Platzierung gar nicht in der DB abzuspeichern. Sie ergibt sich ja jederzeit aus der Sortierung nach dem aktuellen Punktestand.
herbivore
herbivore ... deine idee klingt eigendlich sehr gut ...
aber ich zeig die daten in nem datagrid an ... kann ich da in der ersten spalte (da wo im moment die platzierung steht) einfach andere daten als die aus meinem datensatz anzeigenlassen ?
gibts beim datagrid sowas wie das automatische einfügen (oder anzeigen) von zeilennummern ? das wär ja nen ansatz ... oder ?
ich hab mit datagrids noch nicht viel gemacht ... deswegen bin ich da noch ziemlich neu
möcht mich trotzdem für alle gemachten anregungen bedanken 🙂 ... die werden mit sicherheit nicht nur in das jetzige projekt einfliessen 😉 ...
grüßle
frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)
mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb