ChrisB: MySQL - Rangfolge mit Mehrfachplatzierungen

Beitrag lesen

Hi,

teilnehmer, punkte
A, 15
B, 15
C, 10
D, 8
...

und ich will jetzt >einen Starter< mit seiner Platzierung ausgeben, also z.B.:

platzierung, teilnehmer, punkte
1, A, 15   für [X] = 0
oder
1, B, 15   für [X] = 1
oder
2, C, 10   für [X] = 2
oder
3, D, 8   für [X] = 3

Bisher mache ich nur Folgendes:
SELECT * FROM tabelle ORDER BY punkte LIMIT [X], 1;

Zum einen musst du hier nach punkte DESC (also in absteigender Reihenfolge) sortieren, wenn du obiges Ergebnis erreichen willst; und zum anderen *muss* das Feld teilnehmer auch noch mit in die Sortiervorschrift aufgenommen werden, denn sonst wäre es dem Zufall überlassen, wie zwei Teilnehmer mit gleicher Punktzahl sortiert würden, und damit wäre eine "PLatzvergabe" so wie du sie skizziert hast, nicht möglich.

Wir haben also eine Ergebnismenge, die mit ORDER BY punkte DESC, teilnehmer zu sortieren ist.

Die Platzierung habe ich aber noch nicht hinbekommen...

Die "Platzierung" eines Datensatzes in einer sortierten Menge lässt sich ermitteln, in dem man die Datensätze zählt, die kleiner bzw. grösser (je nach Sortierung) sind, bezogen auf den Vergleich der gewählten Sortierkriterien.
Diese Zählung lässt sich, entsprechende MySQL-Version vorausgesetzt, in einem Subquery unterbringen:

SELECT  
  (  
    SELECT COUNT(*)                            // selektiere die Anzahl der Datensätze  
    FROM tabelle t2                            // aus der Tabelle tabelle, der wir hier einen Aliasnamen t2 geben  
    WHERE t2.punkte > t1.punkte                // deren Punktestand entweder grösser ist,  
          OR (  
            t2.punkte = t1.punkte              // oder gleich gross  
            AND t2.teilnehmer < t1.teilnehmer  // und mit "kleinerem" Teilnehmernamen  
          )                                    // als die jeweiligen Werte aus der "äusseren" Tabelle t1  
  
    ORDER BY t2.punkte DESC, t2.teilnehmer     // sortiert nach Punkten absteigend und Teilnehmer  
  
  ) + 1                                        // und addiere 1 auf diese Anzahl drauf, denn für den ersten Datensatz  
                                               // ist die Anzahl der "davor" liegenden Datensätze ja logischerweise 0  
  
  AS platzierung,                              // gebe diesem neu ermittelten Wert den Aliasnamen platzierung  
  teilnehmer,  
  punkte  
  FROM tabelle t1                              // Aliasname für die "äussere" Tabelle  
  ORDER BY punkte DESC, teilnehmer 

Damit bekommen wir bei obiger Beispieltabelle schon mal folgendes heruas:

platzierung  teilnehmer  punkte
1            A           15
2            B           15
3            C           10
4            D           8

Und an das Ende der gezeigten Query kannst du jetzt noch deine LIMIT-Klausel dranhängen, um damit einen einzelnen Teilnehmer, der die Platzierung X haben soll, zu ermitteln.

MfG ChrisB

--
Light travels faster than sound - that's why most people appear bright until you hear them speak.