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
)
)
);