2

很抱歉发布另一个关于mysql排名的问题,但我已经看过的所有问题和答案都没有帮助我......

我有用户点的mysql表。用户可以获得更多结果。我的目标是从用户及其排名中获得最大结果。

CREATE TABLE results
(`user_id` int, `points` int);

INSERT INTO results VALUES
(1,10),
(2,20),
(3,20),
(4,30),
(4,60),
(5,5),
(1,80);

所以上层解决方案是:

rank | user_id | points
 1        1        80
 2        4        60
 3        3        20
 3        2        20
 4        5        5
4

2 回答 2

1

以下查询可以解决问题:

SET @rank=0;
SET @points=0;

SELECT @rank := IF(@points = a.points, @rank, @rank + 1) AS rank, a.user_id, @points := a.points AS points
FROM (
  SELECT user_id, MAX(points) as points
  FROM results  
  GROUP BY user_id
) a
ORDER BY a.points DESC;

我还创建了它的 SQLFiddle,因此您可以看到它的工作原理:http ://sqlfiddle.com/#!2/7ba2f/12

于 2013-06-05T07:23:05.167 回答
0

从计算每个用户的最大值的聚合别名查询中进行选择时,使用用户定义的变量来生成排名:

select
    (@rank := ifnull(@rank, 0) + 1) as rank,
    user_id,
    points
from (select
    user_id,
    max(points) as points
    from results
    group by 1
    order by 2 desc) x

仅供参考,UDV 一开始是空的,因此ifnull()调用。

于 2013-06-05T07:16:20.297 回答