Sqlite 递归 ORDER BY

问题描述 投票:0回答:1

Table Structure

Tree Look Like This

我想运行查询来获取从 data1 到 data8 的所有 ORDER BY pos。

我拥有的是从 data1 到 data8 的所有节点的 id,但它们不按顺序排列。

我尝试过: @"SELECT * FROM myTable WHERE id IN ("15,16,17,18,19,20,21,22") ORDER BY pos ASC"; 但由于父母立场不同,结果并没有达到预期。


CREATE TABLE "tester" (
    "id"    INTEGER UNIQUE,
    "pid"   INTEGER,
    "pos"   INTEGER,
    "nm"    VARCHAR(255),
    PRIMARY KEY("id" AUTOINCREMENT)
);

INSERT INTO 'tester' (id, pid, pos, nm)
VALUES (1,  0, 0, "My Tester"),
(2, 1, 0, "cat1"),
(4, 9, 1, "subcat1"),
(9, 1, 1, "cat2"),
(10, 2, 0, "subcat3"),
(13, 2, 1, "subcat2"),
(14, 9, 0, "subcat4"),
(15, 4, 0, "data1"),
(16, 4, 1, "data2"),
(17, 13, 0, "data3"),
(18, 13, 1, "data4"),
(19, 10, 0, "data5"),
(20, 10, 1, "data6"),
(21, 14, 0, "data7"),
(22, 14, 1, "data8")
;

结果应如下所示: 按位置订购。

数据5 数据6 数据3 数据4 数据7 数据8 数据1 数据2

sqlite recursion sql-order-by
1个回答
0
投票

您可以使用递归公共表表达式按照父子关系访问所有记录,并使用

order by
来确保节点的深度优先,或者节点具有相同的深度,
pos
定义顺序访问。

然后,您可以从 CTE 选择您需要的内容,按所需的

id
过滤记录并选择名称:

with recursive depth_first(id, pos, nm, level) as (

    select   id, pos, nm, 0
    from     "tester"
    where    pid = 0

    union all

    select   t.id, t.pos, t.nm, depth_first.level+1
    from     "tester" t
    join     depth_first 
          on t.pid = depth_first.id
    order by 4 desc, 2
)
select nm 
from   depth_first
where  id between 15 and 22;
© www.soinside.com 2019 - 2024. All rights reserved.