Laden...

automatische berechnung einer rangfolge

Erstellt von seth vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.687 Views
seth Themenstarter:in
151 Beiträge seit 2004
vor 18 Jahren
automatische berechnung einer rangfolge

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

P
939 Beiträge seit 2003
vor 18 Jahren

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

563 Beiträge seit 2004
vor 18 Jahren

das ausrechnen der reihenfolge wäre auch komplett in einem sql-statement lösbar. sql kann vieles 🙂

#
88 Beiträge seit 2005
vor 18 Jahren

Du kannst das Ergebnis deiner SQL anfrage sortieren lassen:

[php]$sql = "SELECT * FROM Turnier
ORDER BY Punktestand ASC"[/php]

seth Themenstarter:in
151 Beiträge seit 2004
vor 18 Jahren

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

563 Beiträge seit 2004
vor 18 Jahren

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!

seth Themenstarter:in
151 Beiträge seit 2004
vor 18 Jahren

@.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

C
97 Beiträge seit 2005
vor 18 Jahren
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

seth Themenstarter:in
151 Beiträge seit 2004
vor 18 Jahren

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

C
97 Beiträge seit 2005
vor 18 Jahren

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

seth Themenstarter:in
151 Beiträge seit 2004
vor 18 Jahren

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

C
97 Beiträge seit 2005
vor 18 Jahren

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

49.485 Beiträge seit 2005
vor 18 Jahren

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

seth Themenstarter:in
151 Beiträge seit 2004
vor 18 Jahren

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