Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:seleziona la classifica per gli utenti in una tabella dei punteggi

Anche se non sono sicuro di cosa significhi "problematico" in questo contesto, ecco la query riscritta come un semplice LEFT JOIN con una sottoquery solo per ottenere la classifica alla fine (il ORDER BY da fare prima della graduatoria);

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 con cui testare .

EDIT:per tenere conto di group_id, dovrai estendere leggermente la query;

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 altro SQLfiddle .