Найти следующую и предыдущую строку из элемента - PullRequest
0 голосов
/ 10 октября 2018

В веб-приложении у меня есть карусель элементов.

<Prev | Item 1 | Item 2 (active) |  Item 3 | Next>

Когда пользователь непосредственно обращается к странице, где должен быть предварительно выбран «Элемент 2» - мне нужен предыдущий элемент и следующий элемент.

Таким образом, запрос должен выглядеть примерно так: «Дайте мне строку до пункта 2 и после пункта 2 и только эти два».

Итак, учитывая следующие фиктивные данные с идентификатором и логическим полем, еслиэлемент может быть доступен пользователю:

CREATE TABLE items (id integer, can_access boolean);

INSERT INTO items SELECT 1,true;
INSERT INTO items SELECT 2,false;
INSERT INTO items SELECT 3,true;
INSERT INTO items SELECT 5,false;
INSERT INTO items SELECT 6,true;

Когда идентификатор: 3 является активным идентификатором - я хочу найти идентификатор: 1 и идентификатор: 6.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Используя функции управления окнами для получения относительной навигации по всем страницам, ваш запрос будет выглядеть следующим образом:

SELECT
    lag("id") over w AS prev,
    id,
    lead("id") over w AS next
FROM items
WHERE can_access = true
WINDOW w as (order by id) 

, что даст вам следующие результаты:

prev    active    next
-----------------------
NULL    1         3
1       3         6
3       6         NULL

Чтобы только вернуть навигациюдля 3 вы можете использовать промежуточный CTE:

WITH 
    navi(prev, active, "next") AS
    (
        SELECT
            lag("id") over w AS prev,
            id,
            lead("id") over w AS next
        FROM items
        WHERE can_access = true
        WINDOW w as (order by id) 
    )
SELECT * FROM navi WHERE active = 3
0 голосов
/ 10 октября 2018

Предполагая, что вы хотите использовать id для определения порядка строк:

(
    select *
    from items
    where can_access and id > 3
    order by id
    limit 1
)
union
(
    select *
    from items
    where can_access and id < 3
    order by id desc
    limit 1
)

Альтернативные решения могут использовать оконные функции или самостоятельное объединение, обычно простой запрос выше выполняется быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...