web-dev-qa-db-fra.com

Sélectionnez les lignes suivantes et précédentes

J'ai le tableau suivant:

CREATE TABLE post (
  id            bigint primary key,
  thread_id     bigint,
  is_notice     boolean,
  title         text,
  content       text
)

J'affiche la liste en utilisant la requête suivante:

SELECT * FROM post ORDER BY is_notice desc, thread_id desc, id

Puis, étant donné le poste sélectionné par id (c'est-à-dire SELECT * FROM post where id=3), comment récupérer les messages suivants et précédents?

10
alice

L'utilisation de PostgreSQL Window Functions , en particulier LAG et LEAD, devrait être en mesure de vous montrer les entrées précédentes et suivantes de votre table.

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

Une démo peut être trouvée ici: http://sqlfiddle.com/#!15/9fd7a/8

14
bma