描述:一张分组表 为简化问题,只列出核心字段:
id:分组ID,
name:分组名称;
parentID : 父分组的ID
问题是:能不能通过SQL,对于指定的分组,查出下面所有的分组(包括分组下的分组)。
希望的效果:比如分组1下面有分组2和分组3,分组2下面还有分组4,现在给定分组1的ID,希望查询出来的结果包括分组2,分组3,以及分组4。
这个问题是个历史悠久的问题。
从结论说,想一句SQL文是搞不定。特别是楼主还不想依赖DB。
(大多数是DB里写函数的。)
如果需求只是列出根节点的所有子孙节点的话,简易的解决方案是表上再加个RootID的字段。
如果DB根本不让动,或者需求是从任意节点起的话,就只能程序里再循环了。
这两种。
为了效率,可以一次取两层。类似
[code="sql"]
...
where id = {param} or parentID = {param}
[/code]
Oracle吗?select * from table start with id= 1 connect by prior id = parentID ;
建议你改下策略 使用如
id
bigint not null auto_increment,parent_id
bigint,parent_ids
varchar(200) default '',
parent_ids 存储所有父路径
如
id parent_id parent_ids
1 0 0/
2 1 0/1/
3 1 0/1/
4 3 0/1/3/
如查1下的 可以使用 0/1/%查询 跨数据库
如果oracle 楼上的即可
无限极分类。
id name parent_id
1 xxx null
2 aaa 1
3 bbbb 1
4 cccc 2
5 dddd 4
大概就是找寻1的时候 2345 都查询来吧。那就是这个。
但是像你说的1删除了? 有外键不能直接删除啊。必须子全删掉啊,
想通用就必须修改表结构,如2楼所建议的那样(一次改动,到处通用),并不是所有的数据库都支持树状查询,当然通过存储过程也可以实现树状查询,如mysql可以这么做:[url]http://zyn010101.iteye.com/blog/1161361[/url],但效率会随着数据量的增长迅速下降。