Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL - selecione classificação para usuários em uma tabela de pontuação


Embora eu não tenha certeza do que "problemático" significa neste contexto, aqui está a consulta reescrita como um LEFT JOIN simples com uma subconsulta apenas para obter a classificação no final (o ORDER BY precisa ser feito antes do ranking);
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;

Um SQLfiddle para testar .

EDIT:Para levar em conta group_id, você precisará estender a consulta um pouco;
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;

Outro SQLfiddle .