不知道你数据量大不大
小企业站的话,得到父分类ID后,查到所有子分类ID,然后合并到一起:2,5,6,7,8这种
再到产品表sql语句用in关键字查出来,怎么用,搜一下吧...
不清楚in能不能用到索引?如果数据量比较大,就用冗余换效率
给分类表加一个floor字段,父分类就写0,1级子分类就写1,2级子分类写2
假设你有3层分类,那么在产品表加3个字段,cate,cate1,cate2
产品属于哪个子分类,就把从父到2级子 3个字段都填满
筛选时根据传入的cateid,先查出这个分类的floor,然后查出他的所有上级分类id
剩下就是把所有得到的id作为条件筛选了
这里有个关键,要建一个BTREE索引,以cate到cateN的顺序都包括进来
同数据量方法2要快很多,但他的缺点是子分类移动时还要改产品表

解决方案 »

  1.   

    不需要递归啊,你可以到上面一个表里“层次结构”那个字段里面找所点击分类的分类号,凡是有的都是子孙后代分类了。
    比如说点击的分类,id号为18,就可以用cate_path like "%18-%" or cate_path like "%-18%"来筛选。
      

  2.   

    无限级这么关键的词你居然没说!我觉得思路还是4楼的第二种方法,把欲查询的cateid的所有父分类id也都折腾出来,合并到一起去查
    用 ,  或者 - 应该都可以吧
    产品的cateid字段保存这样的格式:1,5,8,21 是从1级分类到N级分类
    如果想查cateid=8的所有产品,那先找出5和1这2个上级分类,生成字符串1,5,8
    然后查询语句用 cateid like '$cateid%',当然这个字段单独加个索引
      

  3.   

    这个方法再把表达式改一下就好了啊。如果id为0的也可能被点击到的话,最后in里面除了搜索出来的之外,就得多包含一个当前点击的id自己。否则都不需要加别的了,因为只有0才会前后都不带“-”出现。
      

  4.   

    这个简单。就一直查询下去。由主分类ID查询出子分类,又从子分类ID查询出第三级,又从第三级ID查询出第四级……当然,你的服务器能经得起这样折腾才行。不管你是不是无限级,都是这样的查询。没有捷径可走。
      

  5.   

    他有一个cate_path字段啊,不需要这样的。
      

  6.   

    这个方法再把表达式改一下就好了啊。如果id为0的也可能被点击到的话,最后in里面除了搜索出来的之外,就得多包含一个当前点击的id自己。否则都不需要加别的了,因为只有0才会前后都不带“-”出现。兄台想的果然周全 180 也包含18,确实是要加杠杠
      

  7.   

    刚在公司没时间细看
    你们讨论的是在分类上加path,然后查询产品的sql语句用in?
    无限级分类用in那效率会不会...in一大堆ID
    还好in可以用到索引,不知道mysql有没有为in排序,否则索引树要从头到底遍历一次,然后复杂度还要乘以id的个数我在4楼和10楼说的都是加速查询的方案
    只是实现的话怎么都有办法
    获得cateid后从内存缓存中(编辑分类时一次性生成)用php的变量hash读取他的分类路径,这一步几乎不耗时间
    然后直接用路径字符串借助索引树一次性定位到全部数据集,速度很快很抱歉天气热有点浮躁,如果有错误请指正