次の表があります。
CREATE TABLE post (
id bigint primary key,
thread_id bigint,
is_notice boolean,
title text,
content text
)
次のクエリを使用してリストを表示します。
SELECT * FROM post ORDER BY is_notice desc, thread_id desc, id
次に、id(i.e。SELECT * FROM post where id=3
)、次の投稿と前の投稿を取得するにはどうすればよいですか?
PostgreSQLの Window Functions 、具体的にはLAG
およびLEAD
を使用すると、テーブルの前後のエントリを表示できます。
select *
from (
select id, thread_id, is_notice, title, content,
lag(id) over (order by is_notice desc, thread_id desc, id asc) as prev,
lead(id) over (order by is_notice desc, thread_id desc, id asc) as next
from post
) x
where 3 IN (id, prev, next);
デモはここにあります: http://sqlfiddle.com/#!15/9fd7a/8