根据where子句选择范围

时间:2016-05-11 15:14:05

标签: sql postgresql

使用这样的表格

id | user | message
___________________
0  | dan  | ...
1  | john | ...
2  | dan  | ...
3  | dan  | ...
4  | john | ...
(and so on)

如何在ID之前从100条消息中选择dan消息到之后的100条消息?如果我只是根据id列+/- 100进行选择,那么两边都不能保证100,因为其他用户的消息可能会妨碍。我想SELECT * from table WHERE user = 'dan' and (some clause here) order by id;

数据库是Postgresql

2 个答案:

答案 0 :(得分:4)

嗯。嗯。 。 。 union all

怎么样?
(select m.*
 from messages m
 where user = 'dan' and id < $id
 order by id desc
 limit 100
) union all
(select m.*
 from messages m
 where user = 'dan' and id > $id
 order by id asc
 limit 100
)
order by id;

对于(user, id)上的索引,这甚至应该相当有效。

答案 1 :(得分:0)

你可以使用ROW_NUMBER ......这样的东西

Select
    ROW_NUMBER() over (paritition by user order by id) as 'mrnk'
    ,id
    ,user
    ,message
From table
Where user = 'dan'
and mrnk <= 100

或者你正在寻找的任何Dan的消息!

相关问题