模拟数据表
catid(目录ID)       upid(上级目录ID)                                 num(值全部为1)
1                                   0      (0无上层目录)                                1
2                                  0                                                                    1
3                                  0
4                                  1       (上层目录ID号为1)
5                                  1
6                                  2       (上层目录ID号为2)
7                                  4       (上层目录ID号为4)
8                                  7       (上层目录ID号为7)
9                                  5        (上层目录ID号为5)
意思就是计算出  每个目录下所有子目录的num总数  和每个子目录下的num总数   需要得到的结果  
catid   1        得到   6
catid   2       得到   2
            3                  1
            4                  2
            5                  2
            6                  1
            7                  2
            8                  1
            9                  1

解决方案 »

  1.   

    select count(upid),catid from tablename group (upid)
      

  2.   

    select count(num),catid from tablename where upid <>0  select count(num),catid from tablename where upid <>0  group (upid)
      

  3.   

    好像没人感兴趣?
    #2、#3、#4 的回复是不负责任的!我给个很另类的解法,供参考(绝不使用递归
    $ar = array (
      1 => array ( 'catid' => '1', 'uid' => '0', 'num' => 1 ),
      2 => array ( 'catid' => '2', 'uid' => '0', 'num' => 1 ),
      3 => array ( 'catid' => '3', 'uid' => '0', 'num' => 1 ),
      4 => array ( 'catid' => '4', 'uid' => '1', 'num' => 1 ),
      5 => array ( 'catid' => '5', 'uid' => '1', 'num' => 1 ),
      6 => array ( 'catid' => '6', 'uid' => '2', 'num' => 1 ),
      7 => array ( 'catid' => '7', 'uid' => '4', 'num' => 1 ),
      8 => array ( 'catid' => '8', 'uid' => '7', 'num' => 1 ),
      9 => array ( 'catid' => '9', 'uid' => '5', 'num' => 1 ),
    );function create_child($ar, $id='id', $pid='pid') {
      foreach ($ar as $k => $item){
        if( $item[$pid] ) {
          $ar[$item[$pid]]['child'][$item[$id]] =& $ar[$k];
        }
      }
      return $ar;
    }foreach(create_child($ar, 'catid', 'uid') as $k=>$v) {
      preg_match_all('/"num";i:(\d+)/', serialize($v), $r);
      $ar[$k]['num'] = array_sum($r[1]);
    }print_r($ar);Array
    (
        [1] => Array
            (
                [catid] => 1
                [uid] => 0
                [num] => 6
            )    [2] => Array
            (
                [catid] => 2
                [uid] => 0
                [num] => 2
            )    [3] => Array
            (
                [catid] => 3
                [uid] => 0
                [num] => 1
            )    [4] => Array
            (
                [catid] => 4
                [uid] => 1
                [num] => 3
            )    [5] => Array
            (
                [catid] => 5
                [uid] => 1
                [num] => 2
            )    [6] => Array
            (
                [catid] => 6
                [uid] => 2
                [num] => 1
            )    [7] => Array
            (
                [catid] => 7
                [uid] => 4
                [num] => 2
            )    [8] => Array
            (
                [catid] => 8
                [uid] => 7
                [num] => 1
            )    [9] => Array
            (
                [catid] => 9
                [uid] => 5
                [num] => 1
            ))
      

  4.   

    好的数据结构,算法就先成功了一半,借用唠叨的结构
    //catid作为数组key
    $ar = array (
      1 => array ( 'catid' => '1', 'uid' => '0', 'num' => 1 ),
      2 => array ( 'catid' => '2', 'uid' => '0', 'num' => 1 ),
      3 => array ( 'catid' => '3', 'uid' => '0', 'num' => 1 ),
      4 => array ( 'catid' => '4', 'uid' => '1', 'num' => 1 ),
      5 => array ( 'catid' => '5', 'uid' => '1', 'num' => 1 ),
      6 => array ( 'catid' => '6', 'uid' => '2', 'num' => 1 ),
      7 => array ( 'catid' => '7', 'uid' => '4', 'num' => 1 ),
      8 => array ( 'catid' => '8', 'uid' => '7', 'num' => 1 ),
      9 => array ( 'catid' => '9', 'uid' => '5', 'num' => 1 ),
    );
    foreach( $ar as $k=>$v)
    {
       $o = $v['uid'];
       while(isset($ar[$o]))
       {
           $ar[$o]['num'] += $v['num'];
           $o = $ar[$o]['uid'];
       }
     
    }print_r( $ar );
      

  5.   

    $ar = array (
       array ( 'catid' => '1', 'uid' => '0', 'num' => 1 ),
       array ( 'catid' => '2', 'uid' => '0', 'num' => 1 ),
       array ( 'catid' => '3', 'uid' => '0', 'num' => 1 ),
       array ( 'catid' => '4', 'uid' => '1', 'num' => 1 ),
       array ( 'catid' => '5', 'uid' => '1', 'num' => 1 ),
       array ( 'catid' => '6', 'uid' => '2', 'num' => 1 ),
       array ( 'catid' => '7', 'uid' => '4', 'num' => 1 ),
       array ( 'catid' => '8', 'uid' => '7', 'num' => 1 ),
       array ( 'catid' => '9', 'uid' => '5', 'num' => 1 ),
    );$count = $arID_UID = array();
    foreach($ar as $k => $v) $arID_UID[$v['catid']] = $v['uid'];foreach($ar as $k => $v) {
       $count[$v['catid']] += $v['num'];
       $tmp = $v['uid'];
       while($tmp) {
           $count[$tmp] += $v['num'];
           $tmp = $arID_UID[$tmp];
       }
    }
    print_r($count);//output
    Array
    (
        [1] => 6
        [2] => 2
        [3] => 1
        [4] => 3
        [5] => 2
        [6] => 1
        [7] => 2
        [8] => 1
        [9] => 1
    )
      

  6.   


    严重同意这句话话……,,,,,还可以用冗余字段记录全部父级关系,如果实现类似统计结果,也是非常容易的,为了以示区别,增加parent_ids,【】例如$ar = array (
      1 => array ( 'catid' => '1', 'parent_ids' => '', 'num' => 1 ),
      2 => array ( 'catid' => '2', 'parent_ids' => '', 'num' => 1 ),
      3 => array ( 'catid' => '3', 'parent_ids' => '', 'num' => 1 ),
      4 => array ( 'catid' => '4', 'parent_ids' => '1', 'num' => 1 ),
      5 => array ( 'catid' => '5', 'parent_ids' => '1', 'num' => 1 ),
      6 => array ( 'catid' => '6', 'parent_ids' => '2', 'num' => 1 ),
      7 => array ( 'catid' => '7', 'parent_ids' => '1,4', 'num' => 1 ),
      8 => array ( 'catid' => '8', 'parent_ids' => '1,4,7', 'num' => 1 ),
      9 => array ( 'catid' => '9', 'parent_ids' => '1,5', 'num' => 1 ),
    );
      

  7.   

    晕,连题目意思都没看懂!
    楼主我想问一句:意思就是计算出 每个目录下所有子目录的num总数 和每个子目录下的num总数   
    前半句好理解,后半句和每个子目录下的num总数 里的子目录下的num总数做何意思?子目录下的文件还是继续子目录或者num?这里我第一个想到的是子目录,但是子目录num又何意思,总数吗,就算是,那么还有就那几个数据真的看不出个道道来,可能是我太笨了!看来回头我应该多写几编记叙文多练练手,最好能写出类似我的XXX,即使有上下文,我也要让人根本不知道我在说什么,多提高一下我的语文表达能力!哈哈!
      

  8.   

         认真看了一下,帖子是6月2号发的,今天是6月4号了,帖子发了2天时间了,而且帖子是置顶的,按理说应该很多人参与才对,可结果到现在居然也没多少人回答,难道是这题目太简单没人参与?没道理啊,一个简单的echo用法问题都有10几个人抢着回答,这个难道比echo还简单?统计了一下,有完整答案的回帖不超过3帖,总共10多帖,我就占了3帖!这样看来不理解这题目意思的人还远远不只我一个,也许他们不好意思在帖子里反问,所以我这里继续顶一下。期待一个能面像初学者详细解释一下题目意思的高手,谢谢!
      

  9.   

    <?php
    $ar = array (
      1 => array ( 'catid' => '1', 'uid' => '0', 'num' => 1 ),
      2 => array ( 'catid' => '2', 'uid' => '0', 'num' => 1 ),
      3 => array ( 'catid' => '3', 'uid' => '0', 'num' => 1 ),
      4 => array ( 'catid' => '4', 'uid' => '1', 'num' => 1 ),
      5 => array ( 'catid' => '5', 'uid' => '1', 'num' => 1 ),
      6 => array ( 'catid' => '6', 'uid' => '2', 'num' => 1 ),
      7 => array ( 'catid' => '7', 'uid' => '4', 'num' => 1 ),
      8 => array ( 'catid' => '8', 'uid' => '7', 'num' => 1 ),
      9 => array ( 'catid' => '9', 'uid' => '5', 'num' => 1 ),
    );
    function searchid($id,$ar,$num){
      global $num;
      foreach($ar as $value){
        if($id==$value['uid']){
           $num++;
           searchid($value['catid'],$ar,$num);
        }
      }
    return $num;
    }
    foreach($ar as $value){
      $num=1;
      echo $value['catid']."=>".searchid($value['catid'],$ar,$num)."<br>";
    }
    ?>只想到这个。
      

  10.   

    <?php$ar = array (
      1 => array ( 'catid' => '1', 'uid' => '0', 'num' => 1 ),
      2 => array ( 'catid' => '2', 'uid' => '0', 'num' => 1 ),
      3 => array ( 'catid' => '3', 'uid' => '0', 'num' => 1 ),
      4 => array ( 'catid' => '4', 'uid' => '1', 'num' => 1 ),
      5 => array ( 'catid' => '5', 'uid' => '1', 'num' => 1 ),
      6 => array ( 'catid' => '6', 'uid' => '2', 'num' => 1 ),
      7 => array ( 'catid' => '7', 'uid' => '4', 'num' => 1 ),
      8 => array ( 'catid' => '8', 'uid' => '7', 'num' => 1 ),
      9 => array ( 'catid' => '9', 'uid' => '5', 'num' => 1 ),
    );function searchid($id,$ar,$num){
      foreach($ar as $value){
        if($id==$value['uid']){
          $num++;
          $num=searchid($value['catid'],$ar,$num);
          
        }
      }
      return $num;
    }foreach($ar as $value){
      $num=1;
      echo $value['catid']."=>".searchid($value['catid'],$ar,$num)."<br>";
    }?>
    这个也许好点。