从“父链接”数据库获取层次结构

时间:2014-04-15 08:05:03

标签: sql sqlite hierarchy

我有一个现有的(旧的)sqlite数据库结构,如下所示:

╔══════════╦═══════════╦══════════╗
║ id_group ║ id_parent ║ sequence ║
╠══════════╬═══════════╬══════════╣
║        1 ║         0 ║        0 ║
║       10 ║         1 ║       70 ║
║      117 ║        10 ║       30 ║
║      124 ║       117 ║       40 ║
║      174 ║      3998 ║       60 ║
╚══════════╩═══════════╩══════════╝

id_parent指向另一个id_group以创建层次结构。

如何创建一个可以一次性提供整个层次结构的查询?当然,我可以浏览所有id_parent并写下层次结构的每个级别,但这似乎是不必要的,也是乏味的。

PS:如果单独使用SQL是不可能的,我也可以使用PHP,C#,Python和whathaveyou。

1 个答案:

答案 0 :(得分:2)

如果您使用的是当前版本的SQLite,则可以使用(符合ANSI标准的)递归查询:

with recursive group_tree as (
  select id_group, 
         id_parent, 
         sequence
  from groups
  where id_parent = 0 -- marks the start of your tree
  union all
  select c.id_group, 
         c.id_parent,
         c.sequence
  from groups p
    join group_tree c on p.id_group = c.id_parent
) 
select *
from group_tree;

如果您想从层次结构中的任何其他位置开始,只需将where id_parent = 0替换为例如where id_group = 10。 {{1}}以获得该组的所有孩子。

手册中的更多详细信息:https://www.sqlite.org/lang_with.html