我想执行一个查询,在整个结果集中排序,但是具有特定行的偏移量(基于列值)。
基本上:
SELECT * FROM users
ORDER BY reputation
LIMIT 3 OFFSET (WHERE users.id = 6)-1
有没有办法执行这样的查询?
对于像这样的表:
USERS
id reputation
1 33
2 34
3 40
4 53
5 45
6 44
应该返回
id reputation
3 40
6 44
5 45
所以,我得到id = 6的用户,以及声望最接近的两个用户(一个更高,一个更低)。
答案 0 :(得分:1)
此查询将返回id = 6的用户的声誉:
select reputation from USERS where id=6
这将返回声誉为> = id = 6的用户的两个用户:
(select *
from USERS
where reputation >= (select reputation from USERS where id=6)
order by reputation
limit 2)
然后您可以返回声誉为< = id = 6的用户
的两个用户(select *
from USERS
where reputation <= (select reputation from USERS where id=6)
order by reputation DESC
limit 2)
当然,这两个查询都将返回id = 6两次的用户(除非有重复的声誉),并且一个记录包含以下用户和前一个用户。您可以将两者结合使用UNION(union将删除id = 6的重复行):
(select *
from USERS
where reputation >= (select reputation from USERS where id=6)
order by reputation
limit 2)
union
(select *
from USERS
where reputation <= (select reputation from USERS where id=6)
order by reputation DESC
limit 2)
这里唯一的问题是声誉可以重复。您希望在这种情况下返回哪些记录?
答案 1 :(得分:0)
假设您正在考虑使用users.id = 33作为偏移行的行,您可以按照以下方式执行您想要的操作 -
选择* from(SELECT * FROM users 按用户排序.id LIMIT 3 OFFSET 32)标签 订购声誉