[MySQL] Highscorelist GROUP BY name



  • Hallo zusammen,

    ich habe eine Highscoreliste mit >130.000 Einträgen. Die Tabelle sieht ungefähr so aus:

    id | name | user_id | points | date
    ---+------+---------+--------+-----
     1 | A    |       0 |    340 | 01.01.2010 11:11:11
     2 | B    |      56 |    122 | 13.12.2011 09:09:09
     3 | A    |       5 |    340 | 27.08.2015 13:37:00
     4 | C    |      24 |    314 | 02.03.2014 03:14:15
    ...|   ...|     ... |    ... | ...
    

    Ist die user_id = 0 bedeutet das, dass sich ein Gast eingetragen hat. Ist die user_id > 0, ist es ein registrierter Spieler gewesen.

    Da die Liste mit so vielen Einträgen sehr unübersichtlich ist, möchte ich für jeden namen nur noch den besten Eintrag anzeigen (unabhängig was die user_id ist). Der Beste Eintrag ist der mit der höchsten Punktzahl und der frühste, d.h. für name = A wäre der beste Eintrag der mit der id = 1.

    Ich möchte folgende Informationen für jeden Namen anzeigen: Punktzahl, Datum, Anzahl der Einträge und ob es ein registrierter Spieler war, oder nicht.

    Mein momentaner Ansatz für die SQL-Abfrage ist:

    SELECT h.id AS id,
                           h.name AS name,
                           h.user_id AS user_id,
                           h.date AS date,
                           g.entries AS entries,
                           g.points AS points
                    FROM highscorelist h
                    INNER JOIN (SELECT name, 
                                    MAX(points) AS points,
                                    COUNT(id) AS entries
                                 FROM highscorelist
                                 GROUP BY name
                                ) AS g
                    ON    g.points = h.points AND
                          g.name = h.name AND
                          h.date = (SELECT MIN(date) FROM highscorelist WHERE name = g.name AND points = g.points)
                    ORDER BY points DESC, h.date ASC LIMIT '.$offset.', '.$length;
    

    Dieser Ansatz führt quasi zum Ziel, aber die SQL-Abfrage dauert Ewigkeiten (>1 Minute). D.h. das macht so keinen Sinn. Mit Suchmaschinen habe ich leider noch nicht den entscheidenden Tipp gefunden.

    Habt ihr eine Idee, wie man so eine Abfrage sinnvoll macht?

    Viele Grüße
    Jan



  • Ohne das jetzt groß analysiert zu haben: bestehen Indizes z.B. wenn ich das richtig sehe nach name, date, points?



  • Ha, das war's. Ich hatte vergessen die Indizes festzulegen. Jetzt geht es blitzschnell 👍 Danke deejey!



  • 👍


Log in to reply