Rolf B: Ressourcenschonende Bestenliste mit Platzierungseinträgen

Beitrag lesen

Hallo Andi,

RANK() klingt ja sehr fancy, aber tut es eine ganz triviale ORDER BY SQL Abfrage nicht ebenso? (Dem dann ja in korrekter Reihenfolge vorliegenden Abfrageergebnis könnte ich in einer PHP Schleife eine Platzierung verpassen,

Fancy ist dein Synonym für "kenn ich nicht, kapier ich nicht"? Kann ich durchaus verstehen, im MYSQL/PHP Bereich sind die Window-Funktionen nicht so bekannt, glaube ich. Aber sie können eine Menge Arbeit sparen.

Du hast nicht gesagt, wo die Punktezahl herkommt, nach der Du den Rang bestimmst. Hast Du eine Row pro - hm - Spieler, oder musst Du erstmal mehrere Sätze aggregieren um die Punktezahl zu bestimmen?

Mal angenommen, es gäbe nur eine Row pro Spieler. Du willst die besten 5 UND deinen eigenen Rang sehen. Mit einem ORDER BY und einem Zähler im PHP müsstest Du alle Sätze der Rangliste einlesen. Sind das viele, kostet das Zeit. Du brauchst aber nur 5 oder 6 davon, je nach eigeneer Platzierung.

Mit RANK kannst Du den Einlesevorgang auf die relevanten Rows beschränken:

SELECT R.ID, R.Name, R.Punkte, R.Rang
FROM (SELECT Name, Punkte, Rank() OVER(ORDER BY punkte DESC) AS Rang
      FROM spielertabelle) R
WHERE R.Rang < 6 OR R.ID = $myId
ORDER BY R.Rang

Fertig. Ob ein nonunique-Index auf die Punkte die Rangbildung ordentlich beschleunigt, weiß ich nicht, das muss ein Explain ergeben.

Natürlich kannst Du auch einen der RANK Workarounds mit einem Zähler verwenden, wie z.B. hier in der ersten Antwort gezeigt:
https://stackoverflow.com/questions/3333665/rank-function-in-mysql

Wenn Du die Punkte erstmal anderweit aggregieren musst, muss man über eine Optimierung nachdenken. Wenn Du das on the fly versuchst, dürfte das bei einer großen Spielertabelle zu lange dauern (wobei man das erstmal ausprobieren und vermessen müsste)

Ich werde also nicht umhin kommen,

unsere Rückfragen zum genaueren Aussehen deiner Daten zu beantworten, um konkrete Hinweise bekommen zu können.

Rolf

--
sumpsi - posui - obstruxi