Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

auch wenn ich mir nicht sicher bin, welcher der beiden klauseln beim selectieren vorrang gegeben wird, versuche es zusätzlich zum ORDER BY noch mit LIMIT; in etwa so:

SELECT rowid,user,punkte FROM tbl_punkte ORDER BY punkte LIMIT 1

s'Amstel

Dann zeigt er aber doch bloß den Datensatz mit den meisten Punkten an...

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

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

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.

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

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

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.

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

Notfalls muss man halt 2 Statements absetzen.

Ist aber auf alle Fälle performanter als irgendwo noch einen extra Rang zu pflegen.

Gruß Jaraz

Danke für eure Hilfe :D

Ich verwende MySQL 5.0, damit funktioniert das ja dann auch :marine !

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.