「SQL概括」树形结构表的存储与查询功能的实现——经过路径方法(非递归)

1、树形结构例子分析:express

以360问答页面为例:http://wenda.so.com/c/函数

咱们经过观察URL,能够明确该页面的数据以树形结构存储,下面三块模块分别为:学习

①根节点spa

②根节点的第一层子节点code

③为左侧所选择节点的下一层子节点blog

(图1)递归

该例简化的树形结构图以下:字符串

(图2)io

咱们不难发现,每当点击图1红框内的类别时,页面主体问题部分会显示该类别节点下全部子节点的问题。所以,须要实现查询出某节点全部子节点的功能。table

 

2、表的存储:

须要存储两张表:

一、类别表

create table [QType] ( QID int not null primary key, QPID int not null, QPath varchar(max) not null, QTypeContent varchar(max) not null )

 

 

 

 

 

 

 

·路径字段的添加方法:找到父节点的Path +“,”+自身的ID 便可。

 

二、问题表

create table QContent ( ContentID int not null primary key, TypeID int not null, Content varchar(max) not null )

 

·问题表的TypeID即为类别表的QID

 

3、表的查询

//查询出某ID的全部子节点(包含自身) select * from QType where CHARINDEX((select QPath from QType where QID=参数),QPath)>0

CHARINDEX函数说明:CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

经过CHARINDEX若是可以找到对应的字符串,则返回该字符串位置,不然返回0。所以当其>0时表示能在路径中找到相应字符串,便可查询到自身以及子节点。

例如:

//查找出以2为ID节点的全部子节点(包含自身) select * from QType where CHARINDEX((select QPath from QType where QID=2),QPath)>0

 

 查询结果:

 

 

 

 

 

所以,实现以上功能(即点击类别找到相应问题显示),则为:

select QContent.Content from QContent where QContent.TypeID IN (select QType.QID from QType where CHARINDEX((select QType.QPath from QType where QID=参数),QPath)>0)

 

4、总结

经过新增一个路径字段的方法,能够无需使用递归,有效提升效率。

正在学习中,欢迎你们指出问题&相互交流!

相关文章
相关标签/搜索