我很久都没有实现出来,那位大哥帮帮忙
数据库表: clss id   position   name
 1      1        电脑
 2      2        手机
 3      1>3>      HP
 4      1>4>     DELL
 5      2>5>     诺基亚
 6      2>6>     三星
 7      1>3>7>   HP台式
 8      1>3>8>   HP笔记本
 9      1>3>9>   DELL笔记本
 10     1>3>10>  DELL台式
 11     2>4>11>  诺基亚直板
 12     2>4>12>  诺基亚滑盖
 13     2>4>13>  三星直板
 14     2>4>14>  三星滑盖 ……    ……     ……
上面是我数据库 
我要通过这个数据库在WEB页面实现效果
 电脑          手机
 >HP           >诺基亚
  >>HP台式      >>诺基亚直板
  >>HP笔记本    >>诺基亚滑盖 
 >DELL         >三星
  >>DELL台式    >>三星直板  
  >>DELL笔记本  >> 三星滑盖 
  ……             ……

解决方案 »

  1.   

    增加一个父类别编号,然后order by positionmysql> SELECT * FROM t_xiaditao2008 t;
    +----+-----+----------+------------+
    | id | pid | position | name       |
    +----+-----+----------+------------+
    |  1 |   0 | 1        | 电脑       |
    |  2 |   0 | 2        | 手机       |
    |  3 |   1 | 1,3      | HP         |
    |  4 |   1 | 1,4      | DELL       |
    |  5 |   2 | 2,5      | 诺基亚     |
    |  6 |   2 | 2,6      | 三星       |
    |  7 |   3 | 1,3,7    | HP台式     |
    |  8 |   3 | 1,3,8    | HP笔记本   |
    |  9 |   4 | 1,4,9    | DELL笔记本 |
    | 10 |   4 | 1,4,10   | DELL台式   |
    | 11 |   5 | 2,5,11   | 诺基亚直板 |
    | 12 |   5 | 2,5,12   | 诺基亚滑盖 |
    | 13 |   6 | 2,6,13   | 三星直板   |
    | 14 |   6 | 2,6,14   | 三星滑盖   |
    +----+-----+----------+------------+
    14 rows in set (0.02 sec)mysql> SELECT * FROM t_xiaditao2008 t order by position;
    +----+-----+----------+------------+
    | id | pid | position | name       |
    +----+-----+----------+------------+
    |  1 |   0 | 1        | 电脑       |
    |  3 |   1 | 1,3      | HP         |
    |  7 |   3 | 1,3,7    | HP台式     |
    |  8 |   3 | 1,3,8    | HP笔记本   |
    |  4 |   1 | 1,4      | DELL       |
    | 10 |   4 | 1,4,10   | DELL台式   |
    |  9 |   4 | 1,4,9    | DELL笔记本 |
    |  2 |   0 | 2        | 手机       |
    |  5 |   2 | 2,5      | 诺基亚     |
    | 11 |   5 | 2,5,11   | 诺基亚直板 |
    | 12 |   5 | 2,5,12   | 诺基亚滑盖 |
    |  6 |   2 | 2,6      | 三星       |
    | 13 |   6 | 2,6,13   | 三星直板   |
    | 14 |   6 | 2,6,14   | 三星滑盖   |
    +----+-----+----------+------------+
    14 rows in set (0.00 sec)
      

  2.   

    读出全部记录后用程序处理$s = <<< DATA
     1      1        电脑
     2      2        手机
     3      1>3>      HP
     4      1>4>     DELL
     5      2>5>     诺基亚
     6      2>6>     三星
     7      1>3>7>   HP台式
     8      1>3>8>   HP笔记本
     9      1>3>9>   DELL笔记本
     10     1>3>10>  DELL台式
     11     2>4>11>  诺基亚直板
     12     2>4>12>  诺基亚滑盖
     13     2>4>13>  三星直板
     14     2>4>14>  三星滑盖
    DATA;function foo($v) {
      return split(" +", trim($v));
    }
    $a = array_map('foo', split("[\r\n]+", $s));
    $o = array();
    $i=3;
    foreach($a as $v) {
      $p = '[' . str_replace('>', '][', trim($v[1], '>')).'][name]';
      eval("\$o$p = \$v[2];");
    }
    print_r($o);
    就得到这样的数组
    Array
    (
        [1] => Array
            (
                [name] => 电脑
                [3] => Array
                    (
                        [name] => HP
                        [7] => Array
                            (
                                [name] => HP台式
                            )                    [8] => Array
                            (
                                [name] => HP笔记本
                            )                    [9] => Array
                            (
                                [name] => DELL笔记本
                            )                    [10] => Array
                            (
                                [name] => DELL台式
                            )                )            [4] => Array
                    (
                        [name] => DELL
                    )        )    [2] => Array
            (
                [name] => 手机
                [5] => Array
                    (
                        [name] => 诺基亚
                    )            [6] => Array
                    (
                        [name] => 三星
                    )            [4] => Array
                    (
                        [11] => Array
                            (
                                [name] => 诺基亚直板
                            )                    [12] => Array
                            (
                                [name] => 诺基亚滑盖
                            )                    [13] => Array
                            (
                                [name] => 三星直板
                            )                    [14] => Array
                            (
                                [name] => 三星滑盖
                            )                )        ))
    接下来的事情就好办了吧?
    由于这种分类列表并不是经常变化的,只在发生变化时执行并缓存就可以了。不必太考虑效率问题
      

  3.   

    数据库:mysql> SELECT * FROM t_xiaditao2008 t;
    +----+-----+----------+------------+
    | id | pid | position | name       |
    +----+-----+----------+------------+
    |  1 |   0 | 1        | 电脑       |
    |  2 |   0 | 2        | 手机       |
    |  3 |   1 | 1,3      | HP         |
    |  4 |   1 | 1,4      | DELL       |
    |  5 |   2 | 2,5      | 诺基亚     |
    |  6 |   2 | 2,6      | 三星       |
    |  7 |   3 | 1,3,7    | HP台式     |
    |  8 |   3 | 1,3,8    | HP笔记本   |
    |  9 |   4 | 1,4,9    | DELL笔记本 |
    | 10 |   4 | 1,4,10   | DELL台式   |
    | 11 |   5 | 2,5,11   | 诺基亚直板 |
    | 12 |   5 | 2,5,12   | 诺基亚滑盖 |
    | 13 |   6 | 2,6,13   | 三星直板   |
    | 14 |   6 | 2,6,14   | 三星滑盖   |
    +----+-----+----------+------------+
    14 rows in set (0.02 sec)
    php:<pre>
    <?php
    $rs = mysql_query('select * from t_xiaditao2008 order by position;');
    $arr_pid = array();
    while ($row = mysql_fetch_array($rs,MYSQL_ASSOC)) {
    if (in_array($row['pid'],$arr_pid)) {
    $deep = array_search($row['pid'],$arr_pid)+1;
    $arr_pid = array_chunk($arr_pid,$deep);
    $arr_pid = $arr_pid[0];
    echo str_repeat(" ",$deep);
    echo str_repeat(">",$deep);
    } else {
    unset($arr_pid);
    echo "---------------\n";
    }
    echo $row['name']."\n";
    $arr_pid[] = $row['id'];
    }
    ?>
    </pre>输出结果:---------------
    电脑
     >HP
      >>HP台式
      >>HP笔记本
     >DELL
      >>DELL台式
      >>DELL笔记本
    ---------------
    手机
     >诺基亚
      >>诺基亚直板
      >>诺基亚滑盖
     >三星
      >>三星直板
      >>三星滑盖
      

  4.   

    另外建议position中用“,”取代“>”,因为这样可以很方便利用find_in_set查找某类别的所有父类或子类。mysql> select * from t_xiaditao2008 t;
    +----+-----+----------+------------+
    | id | pid | position | name       |
    +----+-----+----------+------------+
    |  1 |   0 | 1        | 电脑       |
    |  2 |   0 | 2        | 手机       |
    |  3 |   1 | 1,3      | HP         |
    |  4 |   1 | 1,4      | DELL       |
    |  5 |   2 | 2,5      | 诺基亚     |
    |  6 |   2 | 2,6      | 三星       |
    |  7 |   3 | 1,3,7    | HP台式     |
    |  8 |   3 | 1,3,8    | HP笔记本   |
    |  9 |   4 | 1,4,9    | DELL笔记本 |
    | 10 |   4 | 1,4,10   | DELL台式   |
    | 11 |   5 | 2,5,11   | 诺基亚直板 |
    | 12 |   5 | 2,5,12   | 诺基亚滑盖 |
    | 13 |   6 | 2,6,13   | 三星直板   |
    | 14 |   6 | 2,6,14   | 三星滑盖   |
    +----+-----+----------+------------+
    14 rows in set (0.09 sec)手机及其下所有子类别
    mysql> select * from t_xiaditao2008 t where find_in_set(2,position);
    +----+-----+----------+------------+
    | id | pid | position | name       |
    +----+-----+----------+------------+
    |  2 |   0 | 2        | 手机       |
    |  5 |   2 | 2,5      | 诺基亚     |
    |  6 |   2 | 2,6      | 三星       |
    | 11 |   5 | 2,5,11   | 诺基亚直板 |
    | 12 |   5 | 2,5,12   | 诺基亚滑盖 |
    | 13 |   6 | 2,6,13   | 三星直板   |
    | 14 |   6 | 2,6,14   | 三星滑盖   |
    +----+-----+----------+------------+
    7 rows in set (0.00 sec)HP笔记本及其所有父类别
    mysql> select t.* from t_xiaditao2008 t,t_xiaditao2008 x where x.id=8 and find_i
    n_set(t.id,x.position);
    +----+-----+----------+----------+
    | id | pid | position | name     |
    +----+-----+----------+----------+
    |  1 |   0 | 1        | 电脑     |
    |  3 |   1 | 1,3      | HP       |
    |  8 |   3 | 1,3,8    | HP笔记本 |
    +----+-----+----------+----------+
    3 rows in set (0.00 sec)