sql >> Base de Datos >  >> RDS >> Mysql

MySQL:seleccione el rango para los usuarios en una tabla de puntuación

Aunque no estoy seguro de qué significa "problemático" en este contexto, aquí está la consulta reescrita como un simple LEFT JOIN con una subconsulta solo para obtener la clasificación correcta al final (el ORDER BY debe hacerse antes de la clasificación);

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 para probar .

EDITAR:para tener en cuenta group_id, deberá ampliar un poco la consulta;

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;

Otro SQLfiddle .