Php 使用SQLite创建列表树
我正在尝试使用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
| 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的表结构,所以让这个示例作为起点
文件和一些样本