「SQL归纳」树形结构表的存储与查询功能的实现——通过路径方法(非递归)
一、树形结构例子分析:
以360问答页面为例:http://wenda.so.com/c/
我们通过观察URL,可以明确该页面的数据以树形结构存储,下面三块模块分别为:
①根节点
②根节点的第一层子节点
③为左侧所选择节点的下一层子节点
(图1)
该例简化的树形结构图如下:
(图2)
我们不难发现,每当点击图1红框内的类别时,页面主体问题部分会显示该类别节点下所有子节点的问题。因此,需要实现查询出某节点所有子节点的功能。
二、表的存储:
需要存储两张表:
1、类别表
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 即可。
2、问题表
create table QContent
(
ContentID int not null primary key,
TypeID int not null,
Content varchar(max) not null
)
·问题表的TypeID即为类别表的QID
三、表的查询
//查询出某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)
四、总结
通过新增一个路径字段的方法,可以无需使用递归,有效提高效率。
正在学习中,欢迎大家指出问题&相互交流!
「SQL归纳」树形结构表的存储与查询功能的实现——通过路径方法(非递归)的更多相关文章
- 树形结构表的存储【转自:http://www.cnblogs.com/huangfox/archive/2012/04/11/2442408.html】
在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系.在传统的关系型数据库中,就已经产生了各种解决方案. 此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型 ...
- 使用Oracle数据库实现树形结构表的子-父级递归查询和删除,通过级联菜单简单举例
前言: 我们在开发中,常常遇到单表的子-父id级联的表结构,在树形的深度不确定的情况下,一次查询出某个树形结构下的所有具有子-父级关系的数据变得十分困难. 这时,我们使用oracle提供的CONNEC ...
- Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结
Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结 1. 数据结构( 树形结构,表形数据,对象结构 ) 1 2. 编程语言中对应的数据结构 jav ...
- 使用Oracle数据库实现树形结构表的子-父级迭代(递归)查询和删除,通过级联菜单简单举例
前言: 我们在开发中,常常遇到单表的子-父id级联的表结构,在树形的深度不确定的情况下,一次查询出某个树形结构下的所有具有子-父级关系的数据变得十分困难. 这时,我们使用oracle提供的CONNEC ...
- 「算法笔记」树形 DP
一.树形 DP 基础 又是一篇鸽了好久的文章--以下面这道题为例,介绍一下树形 DP 的一般过程. POJ 2342 Anniversary party 题目大意:有一家公司要举行一个聚会,一共有 \ ...
- sqlserver 树形结构表查询 获取拼接结果
树形表结构如下 IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[Test]') AND ty ...
- 使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例
前言:开发常用的关系型数据库MySQL,mssql,postgre,Oracle,简单的增删改查的SQL语句都与标准SQL兼容,这个不用讲,那么对于迭代查询(不严格的叫法:递归查询)每种数据库都不一样 ...
- Sql Server按树形结构排序查询表记录
http://blog.csdn.net/dxnn520/article/details/8089149 ----------------------------------------------- ...
- mysql中树形结构表的操作
一种是:邻接表模型(局限性:对于层次结构中的每个级别,您需要一个自联接,并且随着连接的复杂性增加,每个级别的性能自然会降低.在纯SQL中使用邻接列表模型充其量是困难的.在能够看到类别的完整路径之前,我 ...
随机推荐
- javascript之JSON引入
JSON: JavaScript Object Notation JavaScript 对象表示法. 由于现在很多在服务器获取数据,很多都涉及json数据格式,因此学习json非常有必要. * 语 ...
- javascript之DOM编程实现城市的联动框
需求;用一张图片表示. 分析: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...
- 10、Libgdx的内存管理
(官网:www.libgdx.cn) 游戏是非常耗资源的应用.图片和音效可能耗费大量的内存,另一方面来说,这些资源没有被Java垃圾回收,让一个垃圾处理来决定将显存中的5M的图片进行释放也不是一个明知 ...
- 【一天一道LeetCode】#46. Permutations
一天一道LeetCode系列 (一)题目 Given a collection of distinct numbers, return all possible permutations. For e ...
- (一)UI设计的一些常识
一.概述 新版本的Xcode似乎框架不明示. UIView:屏幕上看得见摸得着的东西.视图.控件.组件. UIView是一个容器,能容纳其他UIView. UIViewController用来控制UI ...
- scrapy模拟登录微博
http://blog.csdn.net/pipisorry/article/details/47008981 这篇文章是介绍使用scrapy模拟登录微博,并爬取微博相关内容.关于登录流程为嘛如此设置 ...
- STL - 各个容器的使用时机
deque的使用场景:比如排队购票系统,对排队者的存储可以采用deque,支持头端的快速移除,尾端的快速添加.如果采用vector,则头端移除时,会移动大量的数据,速度慢. vector与deque的 ...
- android重启代码
首先新建一个app然后添加 android:sharedUserId="android.uid.system" 再添加重启的权限 <uses-permission andro ...
- UML之状态图
状态图,英文名曰-Statechart Diagram,她是系统的动态方面建模的五种图之一,一个状态图显示了一个状态机,在为对象的生命期建模中,她发挥着重要的作用,展示了单个对象内从状态到状态的控制流 ...
- Chrome浏览器开发调试系列(一)
// 计划写一个 Chrome 浏览器以及 调试器的系列文章,我慢慢写. 边写边改,发觉博客真是个打草稿的好地方. // 本文针对的是当前最新的浏览器Chrome34,如果你的版本不够新,希望你能够更 ...