在MySQL LIMIT中使用WHERE子句进行偏移

时间:2015-12-02 18:04:30

标签: mysql

我想执行一个查询,在整个结果集中排序,但是具有特定行的偏移量(基于列值)。

基本上:

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的用户,以及声望最接近的两个用户(一个更高,一个更低)。

2 个答案:

答案 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)标签 订购声誉