select * from t order by f
即可。有一个限制条件:每个节点不能超过10,或者节点采用多位:
01
01-01
01-01-01这样缺省的排序就是树的顺序。

解决方案 »

  1.   

    任意层很难处理,你只能把字段加长,增加层数。
    如果一定要任意层的话,只能用int作为节点标志,+parent属性了。
    但这样生成树的速度会很慢(只能用递归)
      

  2.   

    正因为不想用递归,才想和大家讨论这个问题,如果有了结果,也算是一大贡献。:)
    可惜惟有楼上这么不厌其烦的参与,谢谢了!
    我想到一个办法,可以增加一个字段index,专门用来保存各个节点前序遍历的序号,当插入一个节点时,先找到插入的位置,插入后,后面的结点index加1。这样,只要用SELECT * FROM t ORDERBY index ASC 和可能得到前序遍历了。
    插入语句大概可以写成
    UPDATE t SET index=index+1 WHERE index>f //f为插入位置序号
    INSERT INTO t(index) VALUES(f+1); //插入节点
    不过这样得频繁修改数据库,不知道这样是否得不偿失?
      

  3.   

    定义一个字段treeindex,可以在存储的时候做一下处理,每个节点用4个字符。
    例如:1          ->  0001
          1-1        ->  00010001
          1-2        ->  00010002
          500-20-30  ->  050000200030因为字段比较长,不要定义成数字类型。
      

  4.   

    楼上的方法其实还是原来的思想。我们可以算一下:4个字符可以有9999个兄弟节点,存储在VARCHAR中最长为255个字节,所以可以有约64层,想一想其实也够了,一般情况下哪个树会有64层呢?我觉得不如加一个字节,有99999个兄弟,51层的树更合适些。兄弟增大了10倍,层数却只减了约5分之1。
      

  5.   

    看来鱼肉和熊掌不能兼得啊!增加一个treeindex字段,会增加维护难度。
      比如:下一个兄弟序号增加1的问题。例如:序号取长度2,有一个第二层节点序号为05-12,那么它的下一个兄弟节点为05-13,但是它怎么知道它的前一个兄弟序号为12?一种方法:在它们的父亲中存储孩子中的最大序号,如存储12,那么再增加一个孩子节点的时候序号就为13,同时把13存储下来。这样就需要再增加一个字段max_id来存储孩子中的最大序号,但如果删除了孩子,就会出现max_id为99,但实际只存储了少于99个孩子,如何处理才能真正存储99个孩子?
      

  6.   

    其实不一定只限于用10个数字标识,完全可以扩展到a-z,A-Z这些英文字母上,这样一来,如果还用5个字符表示一层的话,可以有(10 + 26 + 26 ) ^ 5 - 1 = 916132831个兄弟节点!呵呵!太多了!用3个字符都有238328个兄弟节点呢!