oneside Geschrieben 25. Juli 2006 Teilen Geschrieben 25. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Pinhead Geschrieben 25. Juli 2006 Teilen Geschrieben 25. Juli 2006 Ich meine es müsste mit folgendem Statement gehen ungetestet SELECT rowid,user,punkte FROM tbl_punkte ORDER BY punkte Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
oneside Geschrieben 25. Juli 2006 Autor Teilen Geschrieben 25. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 25. Juli 2006 Teilen Geschrieben 25. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whatever Geschrieben 25. Juli 2006 Teilen Geschrieben 25. Juli 2006 Dann zeigt er aber doch bloß den Datensatz mit den meisten Punkten an... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jasper Geschrieben 25. Juli 2006 Teilen Geschrieben 25. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schlati Geschrieben 26. Juli 2006 Teilen Geschrieben 26. Juli 2006 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). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
oneside Geschrieben 26. Juli 2006 Autor Teilen Geschrieben 26. Juli 2006 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jasper Geschrieben 26. Juli 2006 Teilen Geschrieben 26. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
oneside Geschrieben 26. Juli 2006 Autor Teilen Geschrieben 26. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 26. Juli 2006 Teilen Geschrieben 26. Juli 2006 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 27. Juli 2006 Teilen Geschrieben 27. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
oneside Geschrieben 27. Juli 2006 Autor Teilen Geschrieben 27. Juli 2006 Danke für eure Hilfe Ich verwende MySQL 5.0, damit funktioniert das ja dann auch :marine ! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.