sql >> Databasteknik >  >> RDS >> Mysql

MySQL - välj rankning för användare i en poängtabell

Även om jag inte är säker på vad "problematisk" betyder i detta sammanhang, här är frågan omskriven som en vanlig LEFT JOIN med en underfråga bara för att få rankningen precis i slutet (ORDER BY måste göras innan rankningen);

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;

En SQLfiddle att testa med .

EDIT:För att ta hänsyn till group_id måste du utöka frågan något;

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;

Ännu en SQLfiddle .



  1. Kan php fråga resultaten från en tidigare fråga?

  2. Bättre att använda marköradapter eller Array-adapter

  3. Oracle-tabellen eller -vyn existerar inte inifrån den lagrade proceduren

  4. Skulle singleton vara ett bra designmönster för en mikrobloggsajt?