sql >> Database >  >> RDS >> Mysql

MySQL - selecteer rang voor gebruikers in een scoretabel

Hoewel ik niet zeker weet wat "problematisch" in deze context betekent, is hier de vraag herschreven als een gewone LEFT JOIN met een subquery om de rangorde aan het einde goed te krijgen (de ORDER BY moet worden gedaan voor de rangschikking);

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;

Een SQLfiddle om mee te testen .

EDIT:om rekening te houden met group_id, moet je de zoekopdracht iets uitbreiden;

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;

Nog een SQLfiddle .



  1. PHP-weergave afbeelding BLOB van MySQL

  2. MySQL en de kans dat de verkeerde id wordt geretourneerd door LAST_INSERT_ID()

  3. Veelgestelde vragen over JAVA/JRE in Oracle Apps

  4. cross-dbms manier om te controleren of string numeriek is