Php 使用SQLite创建列表树

Php 使用SQLite创建列表树,php,sqlite,hierarchical-data,Php,Sqlite,Hierarchical Data,我正在尝试使用PHP和SQLite表设置创建一个分层列表,如下所示: | itemid | parentid | name | ----------------------------------------- | 1 | null | Item1 | | 2 | null | Item2 | | 3 | 1

我正在尝试使用PHP和SQLite表设置创建一个分层列表,如下所示:

    |   itemid  |   parentid    |   name    |
    -----------------------------------------
    |   1       |   null        |   Item1   |
    |   2       |   null        |   Item2   |
    |   3       |   1           |   Item3   |
    |   4       |   1           |   Item4   |
    |   5       |   2           |   Item5   |
    |   6       |   5           |   Item6   |
列表将使用无序列表构建,并允许这种类型的树结构:

Item1
    |_Item3
    |_Item4
Item2
    |_Item5
        |_Item6

我见过使用目录和平面阵列可以做到这一点,但我似乎无法使它在这种结构下正常工作,而且没有深度限制。

您使用的是教科书设计,用于在SQL数据库中存储分层数据。这种设计称为邻接列表,即层次结构中的每个节点都有一个指向其直接父节点的
parentid
外键

使用这种设计,您无法生成所描述的树,并且无法支持树的任意深度。你已经弄明白了

大多数其他SQL数据库(PostgreSQL、Microsoft、Oracle、IBM DB2)支持递归查询,这就解决了这个问题。但是SQLite和MySQL还不支持SQL的这个特性

因此,您需要另一个解决方案来存储层次结构。有几种解决方案。有关说明和示例,请参见我的演示文稿


我通常更喜欢我称之为闭包表的设计,但每种设计都有优点和缺点。哪一种最适合您的项目取决于您需要高效地处理数据的查询类型。因此,您应该去研究解决方案,并为自己选择一个。

我知道这是在很久以前问过的,但对于当前的SQLite版本来说,这很简单,不需要@Bill Karwin所说的级别深度。因此,正确的答案应该重新考虑:)

我的表有MCTMPLID和reftmplid列,我的结构起始节点称为ROOT

CREATE TABLE MyStruct (
  `TMPLID` text,
  `REF_TMPLID` text
);

INSERT INTO MyStruct
  (`TMPLID`, `REF_TMPLID`)
VALUES
  ('Root', NULL),
  ('Item1', "Root"),
  ('Item2', "Root"),
  ('Item3', 'Item1'),
  ('Item4', 'Item1'),
  ('Item5', 'Item2'),
  ('Item6', 'Item5');
这是主查询,它构建了树结构

WITH RECURSIVE
  under_root(name,level) AS (
    VALUES('Root',0)
    UNION ALL
    SELECT tmpl.TMPLID, under_root.level+1
      FROM MyStruct as tmpl JOIN under_root ON tmpl.REF_TMPLID=under_root.name
     ORDER BY 2 DESC
  )
SELECT substr('....................',1,level*3) || name as TreeStructure FROM under_root
这是结果

Root
...Item1
......Item3
......Item4
...Item2
......Item5
.........Item6
我确信这可以修改以适应tik OP的表结构,所以让这个示例作为起点 文件和一些样本