MySQL - 为分数表中的用户选择排名

JCZ*_*JCZ 3 mysql subquery ranking

我有一个带有该结构的'user_score'表:

|id|user_id|group_id|score|     timestamp      |
| 1|      1|       1|  500| 2013-02-24 18:00:00|
| 2|      2|       1|  200| 2013-02-24 18:01:50|
| 3|      1|       2|  100| 2013-02-24 18:06:00|
| 4|      1|       1| 6000| 2013-02-24 18:07:30|
Run Code Online (Sandbox Code Playgroud)

我需要做的是从该表中选择来自确切组的所有用户.选择该组中的实际(根据时间戳)得分及其排名.

我所拥有的是(编辑:在Jocachin的评论之后我发现我自己的查询不能像我预期的那样工作,对所有人抱歉):

SELECT user_id, score, @curRank := @curRank + 1 AS rank
FROM (
    SELECT * 
    FROM (
           SELECT * FROM `user_score`
           WHERE `group_id` = 1
           ORDER BY `timestamp` DESC
    ) AS sub2
    GROUP BY `user_id`
) AS sub, (SELECT @curRank := 0) r
ORDER BY `rank`
Run Code Online (Sandbox Code Playgroud)

示例数据和group_id = 1的预期结果:

|user_id|score|rank|
|      1| 6000|   1|
|      2|  200|   2|
Run Code Online (Sandbox Code Playgroud)

但MySQL子选择有点问题,你看到其他任何解决方案吗?

我可能需要稍后获得组中单个用户的排名.我此刻迷路了.

Joa*_*son 5

虽然我不确定在这种情况下"有问题"是什么意思,但是这里的查询被重写为LEFT JOIN带有子查询的普通,只是为了在最后得到排名(ORDER BY需要在排名之前完成);

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;
Run Code Online (Sandbox Code Playgroud)

一个要测试的SQLfiddle.

编辑:要考虑group_id,您需要稍微扩展查询;

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;
Run Code Online (Sandbox Code Playgroud)

另一个SQLfiddle.