代码之家  ›  专栏  ›  技术社区  ›  madflow

从项目中查找下一行和上一行

  •  0
  • madflow  · 技术社区  · 6 年前

    在一个网络应用程序中,我有一个项目旋转木马。

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

    当用户直接访问一个页面,其中“项目2”应该被预选-我需要前面的项目和下一个项目。

    因此,如果用户可以访问该项,则给定以下带有id和布尔字段的伪数据:

    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;
    

    2 回复  |  直到 6 年前
        1
  •  3
  •   Zack    6 年前

    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
    
        2
  •  1
  •   klin    6 年前

    假设你想用 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
    )
    

    替代方案可以使用窗口函数或自连接,通常上面简单的查询速度更快。