使用这样的表格
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
答案 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的消息!