[MySQL/PHP] Platzierung in Rangliste



  • Hallo,

    bisher habe ich immer Platzierungen abgeschätzt (da genauer es nicht nötig war), nun wäre es ganz gut, wenn ich die genaue hätte. Leider komme ich an der Stelle nciht weiter, die MySQL-Abfrage zu machen.

    Folgende Tabelle (>30k Einträge):

    +----+---------+--------+------------+
    | id | user_id | punkte |      datum |
    +----+---------+--------+------------+
    |  1 |      45 |    320 | 1234567890 |
    |  2 |       0 |    275 | 1234267890 |
    |  3 |      32 |    295 | 1212367890 |
    |  4 |      45 |    125 | 1234987930 |
    ...
    

    id ist fortlaufend, eine user_id kann mehrmals vorkommen, genauso wie Punkte und Datum. Jetzt möchte ich von z.B. user_id=45 die beste Platzierung bekommen. Sortiert wird mit (punkte DESC, datum ASC). Wie kann ich mit einer Abfrage nun die Platzierung bekommen bzw. alle Einträge davor zählen?

    Bisher wurde nur folgendes abgefragt: alle Einträge kleiner als die besten Punkte von user_id. Aber diese Abschätzung ist mitlerweile zu schlecht.

    Viele Grüße und einen schönen Sonntag
    Jan



  • Hallo,

    SELECT COUNT(SELECT * FROM tabelle WHERE punkte <= t1.punkte)+1 AS 'Platzierung' FROM tabelle t1 WHERE user_id=45 ORDER BY punkte DESC, datum ASC LIMIT 1
    

    so, oder so ähnlich sollte es funtionieren

    VlG



  • Hallo,

    wir bei Deinem Vorschlag nicht auch vernachlässigt (wie bei mir bisher), dass es viele User mit der selben Punktzahl geben kann? Denn jetzt wird ja der User als letzter bei selber Punktezahl gezählt.

    Kann man die Abfrage nicht irgendwie so gestalten wie: Sortiere und zähle alle Einträge bis zum ersten user_id=45?

    Viele Grüße
    Jan



  • Hallo,

    macht sie doch. Um Nutzer-/Punktedopplungen zu vermeiden kannst du mit GROUP BY arbeiten.

    VlG


Anmelden zum Antworten