Zum Inhalt springen

[MYSQL] Rangplatz in einer Rangliste ermitteln


oneside

Empfohlene Beiträge

Hallo Leute,

ich habe eine Tabelle mit Usern, die an einem Voting teilnehmen.

Ich möchte per Abfrage den aktuellen Platz eines Users im Voting ermitteln. Der Rangplatz ergibt sich aus einem Feld "punkte", welches die erhaltenen Punkte für den User enthällt.

Wie kann ich jetzt am besten aus der Tabelle User ermitteln, auf welchem Rangplatz ein bestimmter User aktuell liegt?

Ich möchte nicht alle User aus der Datenbank laden und dann per PHP über eine Schleife solange einen Zähler mitlaufen lassen, bis der Datensatz des gewünschten Users gefunden ist. Kann man das nicht irgendwie besser lösen?

Gruß

Oneside

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

deine Lösung ist eigentlich das, was ich oben als Beispiel gebracht hatte und was ich für nicht gut empfinde. Gehen wir mal davon aus, dass wir hier von ca. 50.000 Teilnehmern am Voting sprechen, dann würde die Abfrage bei jeder Rangermittlung 50.000 Datensätze (für jeden Teilnehmer einen Datensatz) zurückliefern. Wenn sich dann 500 User gleichzeitig den Rang anzeigen lassen möchten, geht das doch sehr auf die Performance und den Speicherverbrauch....

Gruß

Oneside

Link zu diesem Kommentar
Auf anderen Seiten teilen

select count(*) from tab where punkte >=

(SELECT punkte from tab where username = 'USER');

keine ahnung ob mysql das so kann, anderenfalls in 2 statements zerlegen.

falls gleiche punktzahl einem einzelnen rang zugeordnet werden sollen, muss man count(distinct punkte) statt count(*) verwenden.

-j

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würd den Rangplatz mit in der Tabelle speichern und diese entweder per Cronjob (cronjobs.de) oder dann aktualisieren, wenn sich was in der Rangliste was ändert (z.B. direkt am Ende eines Skripts, bei dem sich Rangverschiebungen ergeben könnten, ein Update machen). Ist IMHO für die Performance deutlich besser, weil du dann ja so den Rangplatz direkt in der Abfrage mit ausgeben kannst, ohne womöglich alle Datensätze erst abzufragen...

Ich z.B. habe eine Datenbank mit Motorsport-Ergebnissen, in der alle Rundenzeiten von Fahrern abgelegt sind und es gibt eine Ansicht, die anzeigt, auf welchem Platz sich ein Fahrer in jeder einzelnen Runde des Rennens befand. Die Position kann man natürlich so herausfinden, indem man eine Rangliste per komplexer Abfrage, in der alle Fahrer abgefragt werden, erstellt (rowid) - hier ists deutlich besser, wenn man die Positionen direkt einträgt, v.a., weil sich die Position ja nicht mehr ändert (im Gegensatz zu deiner Rangliste, die sich ja ggf. "nur" einmal am Tag ändert -> cronjob).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hatte ich mir acuh schon überlegt, aber wenn da wirklich dann mal einige tausend Leute mitmachen, ändert sich vielleicht alle paar Minuten/Sekunden die Rangfolge.... Eigentlich müsste ich dann bei jedem Vote die Ranglistentabelle neu berechnen,was auch nicht gerade toll wäre.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hatte ich mir acuh schon überlegt, aber wenn da wirklich dann mal einige tausend Leute mitmachen, ändert sich vielleicht alle paar Minuten/Sekunden die Rangfolge.... Eigentlich müsste ich dann bei jedem Vote die Ranglistentabelle neu berechnen,was auch nicht gerade toll wäre.

die liste jedesmal neu zu berechnen find ich suboptimal.

was spricht gegen die variante mit count(*)? mit einem index auf die punktespalte ist das performant und einfach zu implementieren.

-j

Link zu diesem Kommentar
Auf anderen Seiten teilen

die liste jedesmal neu zu berechnen find ich suboptimal.

was spricht gegen die variante mit count(*)? mit einem index auf die punktespalte ist das performant und einfach zu implementieren.

-j

Ahhh, deinen Post hatte ich überlesen. Das ist natürlich die Antwort die ich gesucht hatte.

Da bin ich eben irgendwie nicht drauf gekommen, ist wohl die beste Lösung.

Danke :uli

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ahhh, deinen Post hatte ich überlesen. Das ist natürlich die Antwort die ich gesucht hatte.

Da bin ich eben irgendwie nicht drauf gekommen, ist wohl die beste Lösung.

Danke :uli

Vorsicht, die von Jasper vorgeschlagene Lösung geht nicht auf allen MySql Versionen. AFAIK erst ab 4.1.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...