Mysql-获取用户上方和下方的5行(排名)

Mysql-获取用户上方和下方的5行(排名),mysql,ranking,Mysql,Ranking,我有一张桌子: r_user | r_points | -------------------- user1 | 12 | user2 | 124 | user3 | 34 | user4 | 35 | user5 | 57 | user6 | 3 | user7 | 452 | user8 | 8 | user9 | 12 | user-c | 0

我有一张桌子:

r_user  | r_points |
--------------------
user1   | 12       |
user2   | 124      |
user3   | 34       |
user4   | 35       |
user5   | 57       |
user6   | 3        |
user7   | 452      |
user8   | 8        |
user9   | 12       |
user-c  | 0        |
user-b  | 0        |
user-a  | 0        |
假设我想获取user6的排名。我想要5个用户在其条目上方和下方,按r_点和下一个r_用户ASC排序,这样等分的用户user-c、user-b、user-a会像user-a、user-b一样按ASC排序

如果上面或下面没有5个用户,那么差异应该放在相反的位置。所以,如果user6是从底部算起的4,我希望上面取6个用户。始终计数为10个用户

这就是我的结果,我希望:

r_user  | r_points |
--------------------
user5   | 57       |
user4   | 35       |
user3   | 34       |
user9   | 12       |
user1   | 12       | -> In this direction ORDER is other way round
user8   | 8        |
user6   | 3        | --> THATS THE USER BY ID <--
user-a  | 0        |
user-b  | 0        |
user-c  | 0        |
我不知道该怎么做,因为我的表中有r_用户作为PK,没有AI-ID

多谢各位

编辑:

这是我的看法。但是,如果用户位于底部第三位,则该版本不会吸引更多的上/下用户。这仅在下面和上面有5行时有效。那不是我想要的

(
SELECT r_user, r_points
FROM ranking 
WHERE r_points >= ( SELECT r_points FROM ranking WHERE r_user = 'user6' )
ORDER BY r_points ASC LIMIT 5
)
UNION DISTINCT
(
SELECT r_user, r_points
FROM ranking 
WHERE r_points <= ( SELECT r_points FROM ranking WHERE r_user = 'user6' )
ORDER BY r_points DESC LIMIT 6
)
ORDER BY r_points DESC, r_user ASC

您写道您没有唯一的id,因此在我的小提琴中,用户是通过以下行硬编码的:IFt.r_user='user2'。要更改用户,必须更改该值

希望这对您有所帮助:


所以您需要10条记录,或者仅仅为了对表进行排序?10条记录,因为表可以有10000行。我会查询上面九个和下面九个,然后让你的客户剪辑范围。
SELECT *
FROM (
  SELECT 
    t.*,
    IF(@idx IS NULL, @idx:=1, @idx:=@idx+1) idx,
    IF(t.r_user = 'user2',@median:=r_points, IF(@start IS NULL, @start:=@idx, IF(@after IS NULL, @start:=@idx, null))),
    IF(@median IS NULL, IF(@before IS NULL,@before:=1, @before:=@before+1) ,
    IF(@after IS NULL ,@after:=0, @after:=@after+1)) 

  FROM (
    SELECT * 
    FROM table1 
    ORDER BY r_points DESC
    ) t
  ) t2
 WHERE IF(1+@before+@after<=10, true,
          IF(@before<=5, t2.idx >= 0 AND t2.idx <= @start+5+(5-@before),
             IF(@after<=4, t2.idx >= @start-4-(4-@after),
                t2.idx >= @start-4 AND t2.idx <= @start+5
             )
          )
        );