SQL,根据分组ID,查询该分组下的所有分组以及分组下的分组

描述:一张分组表 为简化问题,只列出核心字段:
id:分组ID,
name:分组名称;
parentID : 父分组的ID

问题是:能不能通过SQL,对于指定的分组,查出下面所有的分组(包括分组下的分组)。

希望的效果:比如分组1下面有分组2和分组3,分组2下面还有分组4,现在给定分组1的ID,希望查询出来的结果包括分组2,分组3,以及分组4。

这个问题是个历史悠久的问题。

从结论说,想一句SQL文是搞不定。特别是楼主还不想依赖DB。
(大多数是DB里写函数的。)

如果需求只是列出根节点的所有子孙节点的话,简易的解决方案是表上再加个RootID的字段。

如果DB根本不让动,或者需求是从任意节点起的话,就只能程序里再循环了。

  1. 服务器端程序里面循环。
  2. 客户端JS异步请求。

这两种。
为了效率,可以一次取两层。类似
[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],但效率会随着数据量的增长迅速下降。