在MySQL中返回10行,其中特定行位于第5位

时间:2018-01-23 11:27:47

标签: mysql

我正在尝试构建一个排行榜,我按照得分排序返回10行。

但是,我希望特定用户(ME)出现在第5行 - 所以我希望特定用户以上的四个分数更高,而特定用户以下的五个用户分数更低。

数据库中可能有数百行。

因此,换句话说,我试图获得10行,我想要的用户在中间。

这样的事情;

user_id, pos, name, score 
10, 1, Rita, 100 
50, 2, Sue, 95 
30, 3, Bob, 60 
90, 4, Billy, 50 
**14, 5, ME, 45** 
46, 6, Bob, 30 
89, 7, Thornton, 20 
83, 8, Jeremy, 10 
99, 9, Kyle, 5 
16, 10, John, 1

我想我可以使用多个SQL命令来破解它,但如果可以在一个命令中完成,我绝对难倒?

1 个答案:

答案 0 :(得分:0)

假设您的pos字段始终是最新的,您可以在数据库中获取Me的位置后使用the between operator
使用这两个查询,您可以获得所需的结果:

select @pos:=pos FROM so where user_id=5;

select * 
FROM so
where pos between @pos-4 
              and @pos+5
order by score desc;

第一个查询将@pos变量值设置为所需行的位置 第二个查询获取@pos-4 and @pos+5之间的结果。

这是输出:

user_id pos name    score
3       3   Bob     130
4       4   Billy   120
6       5   Bob2    110
7       6   Joe     100
5       7   Me      90
8       8   Mario   80
9       9   Paul    70
10      10  Jeremy  60
11      11  Kyle    50
12      12  Kane    40

这是demo

您也可以在一个查询中执行此操作,但我认为这会影响性能。

select * 
FROM so
where pos between (select pos FROM so where user_id=5)-4 
              and (select pos FROM so where user_id=5)+5
order by score desc;