我正在尝试构建一个排行榜,我按照得分排序返回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命令来破解它,但如果可以在一个命令中完成,我绝对难倒?
答案 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;