2016-05-11 2 views
0

С таблицей, как этоВыбор диапазона, основанный на где положение

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

Как я могу выбрать сообщения от DAN 100 сообщений до ид до 100 сообщений после? Если я просто выбираю на основе столбца id +/- 100, то с обеих сторон не гарантируется 100, потому что сообщения других пользователей могут мешать. Я хотел бы SELECT * from table WHERE user = 'dan' and (some clause here) order by id;

База данных является Postgresql

ответ

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).

+0

Это именно то, что мне нужно, спасибо. Следует упомянуть, что порядок для первого подзапроса неверен, потому что он использует порядок desc для захвата необходимых строк, но затем не упорядочивает их по возрастанию после. Вам нужно бросить «ORDER BY id» в конце запроса. –

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 

Или все, что количество сообщений Даны вы ищете!

+0

Извините ... только что заметил тег postgresql ... этот результат представляет собой запрос сервера sql. Не уверен, что это относится к postgresql. –

+0

'row_number()' присутствует и в postgresql, FYI – Rahul

Смежные вопросы