Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL - sélectionnez le classement des utilisateurs dans un tableau de score

Bien que je ne sois pas sûr de ce que "problématique" signifie dans ce contexte, voici la requête réécrite en tant que simple LEFT JOIN avec une sous-requête juste pour obtenir le classement à la fin (le ORDER BY doit être fait avant le classement);

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;

Un SQLfiddle à tester avec .

EDIT :pour prendre en compte group_id, vous devrez étendre quelque peu la requête ;

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;

Un autre SQLfiddle .