Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL - Wählen Sie den Rang für Benutzer in einer Bewertungstabelle aus

Obwohl ich mir nicht sicher bin, was "problematisch" in diesem Zusammenhang bedeutet, ist hier die Abfrage als einfacher LEFT JOIN umgeschrieben mit einer Unterabfrage, nur um das Ranking am Ende richtig zu bekommen (die ORDER BY muss vor dem Ranking erfolgen);

SELECT user_id, score, @rank := @rank + 1 AS rank FROM
(
  SELECT u.user_id, u.score
  FROM user_score u
  LEFT JOIN user_score u2
    ON u.user_id=u2.user_id
   AND u.`timestamp` < u2.`timestamp`
  WHERE u2.`timestamp` IS NULL
  ORDER BY u.score DESC
) zz, (SELECT @rank := 0) z;

Ein SQLfiddle zum Testen .

BEARBEITEN:Um group_id zu berücksichtigen, müssen Sie die Abfrage etwas erweitern;

SELECT user_id, score, @rank := @rank + 1 AS rank FROM
(
  SELECT u.user_id, u.score
  FROM user_score u
  LEFT JOIN user_score u2
    ON u.user_id=u2.user_id
   AND u.group_id = u2.group_id       -- u and u2 have the same group
   AND u.`timestamp` < u2.`timestamp`
  WHERE u2.`timestamp` IS NULL
    AND u.group_id = 1                -- ...and that group is group 1
  ORDER BY u.score DESC
) zz, (SELECT @rank := 0) z;

Eine weitere SQLfiddle .