树形结构数据库递归查询问题

一号男嘉宾 发布于 2013/11/05 17:26
阅读 5K+
收藏 0

假如有一树形结构,比如公司的组织架构,先是总公司,再是分公司,再是部门,在是人员。通过当前记录的id和parentID关联成树形结构。

比如现在有如下要求,选择了日本分公司,要求一次展示出日本分公司(包括该公司下的所有部门)的所有人员,或者现在选择了美国分公司的销售部,要求一次展示出来美国分公司销售部的所有人员,这样的需求,除了递归查询数据库,有其他好的办法没?

加载中
0
宏哥
宏哥

既然递归查询可以解决问题, 为什么不用递归查询.

难道是传说中的mysqler?

一号男嘉宾
一号男嘉宾
递归也跟mysqler有关系?sqlserver和oracler就不用递归查询了? 这不是觉得每次连接数据库查询慢么,想看看其他兄弟们有更好的方法没。
0
宏哥
宏哥

回复 @梅公子

mysql 不支持递归查询

oracle, sqlserver, postgresql 可以用递归查询一次查出

你到底知道不知道什么是递归查询?

度娘 connectby 

张亦俊
张亦俊
MySQL可以用WITH AS来做递归查询么?
0
中山野鬼
中山野鬼
不能构造树状索引吗?哈。
0
宏哥
宏哥

引用来自“中山野鬼”的答案

不能构造树状索引吗?哈。

oracle, postgresql都可以

mysql 不支持树状查询

楼主以为在"真正的数据库" 里面也是像mysqler一样, 做N次查询, 在程序里面递归的.

13123123
13123123
你妹。。。
宏哥
宏哥
回复 @13123123 : 果然是mysqler.
13123123
13123123
你说的 我只能表示笑而不语。。。
13123123
13123123
说实话 oracle 和ms sql 在大学里面学过 刚出来的时候 oracle 我用过一年多 我们公司系统现在是msssql 我看的懂你的sql 现在我主要用mysql 不要小瞧mysql mysql威力 确实没有oracle 和mssql高 我觉得效率高低在于你优化和sql 语句
宏哥
宏哥
回复 @13123123 : mysql不是数据库. oracle,ms sql, postgresql 才是真正的数据库. 你对数据库一无所知.看懂那句SQL,你需要6个月以上对于数据库的学习.
下一页
0
吐槽的达达仔
吐槽的达达仔
还有DB2也支持树形查找,也就是递归。。。
0
宏哥
宏哥

尽早皈依两个凡是

才能入开发门

0
pantrick
pantrick

别听那些人胡扯什么mysql不行,完全可以,你搜索google,我就用了一次性查找子元素的,不过后来我觉得parentid这个方式麻烦,就用了左右值法存储,虽然过程复杂了些,但是一旦弄懂了,树结构操作就不成问题!

左右值无限分类 预排序遍历树算法:modified preorder tree traversal algorithm - joe - 博客频道 - CSDN.NET

pantrick
pantrick
回复 @郭煜 : 左右值适合大量查询而非频繁修改的树结构,对照楼主的需求,这种比较合适,至于缓存,不在这个范畴之内吧,缓存啥地方都能用!
乌龟壳
乌龟壳
回复 @抓瓦工人 : 对节点的变更会导致要扫描和更新大量相关的值,增加删除的节点如果是一个新的层更是如此,影响到所有的层全部都要更新。何必呢?如果真的那么在乎查询速度,第一次慢一点没关系,缓存起来就可以了。如果要实时提取,这种方式的插入速度就和实时本来就是相悖的。
乌龟壳
乌龟壳
回复 @抓瓦工人 : 左右值是用存储空间和插入的时间的代价,来达到提高查询时间的效果。而这个,为什么不交给memcache,数据库里只需要按照范式存储必要的数据就可以了。
pantrick
pantrick
回复 @13123123 : 不是查询方法,而是设计方法u,parent模式必然导致递归查询,而左右值是条件查询,非递归,效率速度数据量越大越好,仔细看看那片文章!
13123123
13123123
不管你那种查询方法 都是递归 然后慢慢往下走 只能看看能不能从业务上面找寻一个比较好的算法
0
宏哥
宏哥

引用来自“抓瓦工人”的答案

别听那些人胡扯什么mysql不行,完全可以,你搜索google,我就用了一次性查找子元素的,不过后来我觉得parentid这个方式麻烦,就用了左右值法存储,虽然过程复杂了些,但是一旦弄懂了,树结构操作就不成问题!

左右值无限分类 预排序遍历树算法:modified preorder tree traversal algorithm - joe - 博客频道 - CSDN.NET

被mysql 搞过的脑子, 都无法学习任何有用的东西了.

2013-11-05 19:22:50 --- DEBUG: Query Type:SELECT
2013-11-05 19:22:50 --- DEBUG: SQL:select "id","pkg_id","template_id","hostname","loc","un","doc_type","is_static","pkg_uname","tp_uname","ownername","updatorname","created","updated"  from v_content where ( role_id in (select id from (select * from connectby('role','id','pid','id','0',0,';') as t(id int, pid int, level int, branch text, pos int) where level >=1) utree) or owner_id='10000') and loc like '/%' order by "updated" desc limit 20
2013-11-05 19:22:50 --- DEBUG: Query Performance=Array
(
    [time[s]] => 0.022407054901123
    [memory[bytes]] => 920
)

乌龟壳
乌龟壳
回复 @13123123 : 业务上能减少,以上那个SQL也能做相应的变化减少查询的开销,你以为以上那条sql是定死的只能那样写?现在讨论都不是这个,所以说思路不清晰。
pantrick
pantrick
你脑子有问题吧,有新业务需求你都要数据库天然支持?时间长了难免变成低能,!
13123123
13123123
no 比如在查询上面 从业务上面减少查询次数
乌龟壳
乌龟壳
回复 @13123123 : 查询深度是业务问题,业务有这个要求你能怎么办,如果业务不需要无限深度,限制一下就可以了。这和查询有什么关系?思路不够清晰。
13123123
13123123
@宏哥 请你讲点道理哈
下一页
0
刘龙彪
刘龙彪
NestedSetModel 可能是你要的
返回顶部
顶部