更正:帖中的“则通过$result=list(1,"--")取得的结果应该是:”应为“则通过$result=listcat(1,"--")取得的结果应该是:”

解决方案 »

  1.   

    树结构 或 链结构不就可以了吗?

    initial:
    $all_id = array();
    $all_name = array();
    $all_parent = array();
    建立一个二纬表,赋值后,每列对应一个分类()。
    $pos = array_search($yourname,$all_name);
    if( gettype($pos)!='boolean' ) echo $all_id[$pos];
      

  2.   

    要显示无限分类,可以直接用梅花雪写的MzTreeView1.0,
    然后研究他的算法
    http://www.meizz.com/Web/Article/211/436.htm
      

  3.   

    参考:
    Set Nocount On
    Create Table test(userid int,tstr varchar(10),anid int)
    Insert into test Select 1,'id a',0
    Union Select 2,'id b',0
    Union Select 3,'sub id c',1
    Union Select 4,'sub id d',1
    Union Select 5,'sub id e',2
    Union Select 6,'sub id f',2
    Union Select 7,'sub id g',3
    Union Select 8,'sub id h',4Create Table #t ([id] int,[level] int,sid varchar(100))
    Declare @l int
    Set @l=0
    Insert into #t select [userid],@l,[userid] From [test] Where test.anid=0
    While @@rowcount>0
    Begin
    Set @l=@l+1
    Insert into #t select a.[userid],@l,CAST(b.sid as varchar)+','+CAST(a.[userid] as varchar) from [test] a,#t b where a.[anid]=b.[id] and b.[level]=@l-1
    EndSet Nocount OffSelect REPLICATE('-',level*2)+CAST(id as varchar) As rt From #t order by sidDrop Table #t
    Drop Table test--结果:/*
    rt
    -------------------------------------------------------------------------------
    1
    --3
    ----7
    --4
    ----8
    2
    --5
    --6(所影响的行数为 8 行)
    */
      

  4.   

    把最后那句查询语句替换成:
    Select REPLICATE('-',t.level*5)+test.tstr As rt From test left outer join #t t on test.userid=t.id order by t.sid结果如下:rt
    -------------------------------------------------------------------------------
    id a
    -----sub id c
    ----------sub id g
    -----sub id d
    ----------sub id h
    id b
    -----sub id e
    -----sub id f(所影响的行数为 8 行)
      

  5.   

    再换一下就象你要求的了:
    Select t.id,REPLICATE('-',t.level*5)+test.tstr As rt From test left outer join #t t on test.userid=t.id order by t.sidid          rt
    ----------- --------------------------------
    1           id a
    3           -----sub id c
    7           ----------sub id g
    4           -----sub id d
    8           ----------sub id h
    2           id b
    5           -----sub id e
    6           -----sub id f(所影响的行数为 8 行)
      

  6.   

    这是一个邻接表求解的问题,一般使用递归实现
    function listcat($cat,$prefix,$deep=0) {
      $rs = mysql_query("select * from tbl_name where parent=$cat");
      while($row = mysql_fetch_array($rs)) {
        printf("%d %s$s<br>", $row['id'], $deep==0?'':str_repeat($prefix, $deep), $row['name']);
        listcat($row['id'], $prefix, $deep+1);
      }
    }
    由于需要对每一个后续节点做数据库查询,所以当节点层次较多时效率较低
    当“树”的规模不是很大的时候可以一次性读取全部数据到内存然后递归或不递归处理
    $rs = mysql_query('select * from tbl_name order by parent');
    function listcat($rs,$cat,$prefix,$deep=0) {
      for($i=0; $i<mysql_num_rows($rs); $i++) {
        mysql_data_seek($rs, $i);
        $row = mysql_fetch_array($rs);
        if($row['parent'] == $cat) {
          printf("%d %s$s<br>", $row['id'], $deep==0?'':str_repeat($prefix, $deep), $row['name']);
          listcat($rs, $row['id'], $prefix, $deep+1);
        }
      }
    }
    邻接表的数据结构决定了:向表中加入数据很简单,从表中读取数据比较复杂。递归算法也需要占用大量的内存
    所以这种结构不太适合工作在web方式中。在web方式中对于数据的处理通常是大量的读而少量的加
    在目前的网站中那么回避了“树”形显示(比如本论坛),要么采用“中值排序”算法
    但是中值排序算法也有致命的弱点——可容纳的层次是有限的(虽然理论上是无限的)最近看到一种改进的“前序遍历”算法,读取的效率很高。而且可以极方便的获取节点的子节点数、子节点的路径等
    如果有兴趣可以找些资料看看,一起讨论一下