mysql数据库函数不太熟悉 不知道有没有类似sqlserver2000的replace函数 
思路:用replace把","过虑,然后统一长度(如何实现?),按照数值排序

解决方案 »

  1.   

    在absPath里的标识是否可以加双位标识?
    即news => 0,01,02 story 不变还是,0,01,12想想这样子的排序就会没有问题。一般情况下我用的话都是采用如下方法
    menu     setp
    aaaaa    001
    bbbbb    002
    ccccc    001001
    ddddd    001002
    eeeee    002001
    fffff    002002输出结构如下:
    /+--aaaaa
     |   |-ccccc
     |   |-ddddd
     |
     +--bbbbb
     |   |-eeeee
     |   |-fffff
      

  2.   

    你构造 absPath 应该是这样写的吧?
    concat(catPath,',',catID) as absPath如果你写做
    concat(catPath,',',lpad(catID,2,'0')) as absPath就会得到这样的结果
    catID     catTitle     catPath   absPath
      1          root         0         0,01
      2          news         0,1       0,1,02
      3          music        0,1       0,1,03
      4          sports       0,1       0,1,04
      ..........................
      12         story        0,1       0,1,12
    这就暂时解决了你的问题
      

  3.   

    order by SUBSTRING_INDEX(str,delim,count)
      

  4.   

    to xuzuning
    我是这么构建的为什么会是暂时?to  flyonet
    没太理解怎么排序
      

  5.   

    你还没有完全明白。
    如果你有
    catID     catTitle     catPath   absPath
      1          root         0         0,01
      2          news         0,1       0,1,02
      3          music        0,2       0,2,03
      4          sports       0,1       0,1,04
      ..........................
      12         story        0,11       0,11,12
    这样的数据,那又会出现什么问题呢?象你这样组织数据的方式,需要让每一节都是定长的。这当然就不能无限了,其实无限也没多大实用价值
      

  6.   

    order by catpath ,catid
      

  7.   

    不用递归?
    这样吧...
    http://www.yubeinet.com/article.php?id=10不过不知道数据库内部是如何实现的....
      

  8.   

    to surfchen
    这个不是你写的吗?怎么会不知道数据库内部是怎么实现的?感觉你这个也和我的类似了,
      

  9.   

    如果不考虑效率。可以用 SQL语句把 0,1,12 转化为  0*10000+1*1000+12*1 =1012  0,1,2 则为 1020 这样就可以很好地排序了。当然,还可以格式化 成 0,1,12   0,1,02 这样也行。
      

  10.   

    你在生成的时候就格式化好。SELECT CONCAT("0,1,",RIGHT(100+2,2))
      

  11.   

    javascrpt+php+mysql实现无限制菜单:
    下载地址:http://www.lcsww.com/download/index.asp
      

  12.   

    真正的“无限”是不存在的!只能说大到某个规模就算是了。
    一般有两种组织数据的方法:
    1、链表法
    只需保存接点id和父接点paren_id
    树的极限由id字段类型和操作系统允许的文件尺寸决定
    特点:写入、修改、删除接点简单;读出比较复杂2、插值排序法
    除保存接点id和父接点paren_id外还需附加两个插值计算的字段
    对“中值排序法”你大概并不陌生,其实他就是这个算法的特例
    特点:写入比较复杂、修改、删除接点简单;读出简单
    算法概要:
    根据预计的规模确定顶层接点的节距
    插入子接点时令其插值在相邻接点之间,通常在一侧插入10-20个接点不会出现问题
    但是因计算精度的问题,接点值还是会相同的。此时需要调整其后的所有接点的值,通常增加一个节距即可
    由此看到,插入接点的算法是比较复杂的。
    但是,实用中插入操作是很少的。主要是读出操作。读出时只需对插值排序就可以了
    如果在附以表示层次的deep字段,重构“树”就更简单了
      

  13.   

    只明白链表法。
    此法就是多菜鸟的
    -----------------------
    一般情况下我用的话都是采用如下方法
    menu     setp
    aaaaa    001
    bbbbb    002
    ccccc    001001
    ddddd    001002
    eeeee    002001
    fffff    002002
    --------------------------
    么?
      

  14.   

    1、递归处理可以使得代码很简练,但执行效率有待商榷。况且递归的深度受堆栈的限制
    2、移动中值排序法的接点时是修改插值在目的地的上下接点插值之间,算法并不复杂
       而按你现在的方案则有大量的子串修改
    3、to zairwolfd(君子兰) 
       链表法不是多菜鸟所用的方法
       多菜鸟所用的方法不能达到“无限”层次的目的
       比如若每个层次用3位数字表示,则一个varchar字段只能容纳pow(255/3,1000)个接点,当然也是足够大了。若改用text类型,虽然可容纳更多的接点,但由于大多数据库不能在text类型字段上建立索引。执行效率要大打折扣了