求一个无限级分类,读取分类下面数据检索的逻辑思路

vgy12304 2010-02-25 11:28:56
无限级分类表infoClass
编号id 名称title 级别lev 所属分类forClass
0 大分类 0 0
1 二级分类 1 0
2 三级分类a 2 1
3 三级分类b 2 1
4 四级分类 3 2
5 五级分类 4 4


数据中心表infoList
编号 名称title 内容content 所属分类forClass
0 xxx dddd 0
1 ccc ccc 1
2 vvv vvv 2
3 bbb bbb 3
4 nnn nnn 4
5 ggg ggg g


目前查询所有记录:select * from infoList

查询其中一个分类的记录select * from infoList from forClass=4

如果要查看其中任一个级别的分类及其所有子分类的记录呢,逻辑如何设计哦

例如:select * from infoList forClass=2 and forClass=4(三级分类a及其所有子分类的记录),如果它下面有很多级子分类呢

相当于这个问题,windows文件夹里面有无限级的子文件夹,如果获取这个文件夹中到底有多少个文件
...全文
378 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
vgy12304 2010-03-10
  • 打赏
  • 举报
回复
没有满意答案,定一下,求数据结构+算法
xuenping 2010-03-04
  • 打赏
  • 举报
回复
贡献你一个函数

/*
*调整顺序
*$upid——要提取的upid下的信息[默认从零开始递增]
*/
function listOrder($arr,$upid=0,$newTB='')
{
$info = array();
$sub = array();
$temp = array();

foreach($arr as $aName => $aValue)
{
if($aValue[$newTB.'upid']==$upid)
{
$temp = $aValue;
$sub = listOrder($arr,$aValue[$newTB.'id'],$newTB);
$info[] = $temp;
//$info[] = $sub;
if(isset($sub)&&count($sub)!=0)
{
foreach($sub as $sName => $sValue)
$info[] = $sValue;
}
unset($arr[$aName]);
}
}
return $info;
}

当 $upid=0 时,是排序 当$upid!=0时,是获取当前分类下的所有子分类
helloyou0 2010-03-04
  • 打赏
  • 举报
回复
引用 5 楼 vgy12304 的回复:
回2楼的,你搞错了,我将的是数据结构,不是实现特效

回3楼的,我是在子分类加路径实现的,跟你说的差不多,需要不停级别的寻址,数据少还行,数据多的话,就服务器就拖死了


什么样的路径, 为什么会"需要不停级别的寻址"?
xuenping 2010-03-04
  • 打赏
  • 举报
回复
引用 10 楼 jzh2004 的回复:
在实际应用中有这种需求吗?
难道在页面上不是一层层找下去,而是显示一个列表:一级分类,二级分类。。。。N级分类?
这个用户体验太差了吧。


做大型多栏目站点时是会用上的 不过一般也就5-6层

我的数据分类表设计跟你LZ设计的这个差不多
我采用的方法是:

一次性读取全部数据,
然后对读取的数据 递归 获取下级所有子类 然后缓存处理结果。
freespacezjx 2010-03-04
  • 打赏
  • 举报
回复
很想知道这种数据结构,用数据库如何设计效率比较高, 关注中!~
xuzuning 2010-03-04
  • 打赏
  • 举报
回复
目前比较成熟的算法有
邻接表法: 结构简单,修改灵活,检索需要使用递归
前序遍历法: 结构稍嫌复杂,修改稍嫌复杂,检索简单

在网上都可以找到现成的代码

沪php攻城师 2010-03-04
  • 打赏
  • 举报
回复
在实际应用中有这种需求吗?
难道在页面上不是一层层找下去,而是显示一个列表:一级分类,二级分类。。。。N级分类?
这个用户体验太差了吧。
天降大任于斯 2010-03-03
  • 打赏
  • 举报
回复
数据有多少?一千行?
1,生成js文件,在客户端做递归
2,生成php数组,发挥想象力
vgy12304 2010-03-03
  • 打赏
  • 举报
回复
是做出来的 ,在后面加一个路径,但是效率太低,求一个高效的方法
gg123456kk 2010-02-26
  • 打赏
  • 举报
回复
不错 学习学习 嘿嘿
i李小武 2010-02-26
  • 打赏
  • 举报
回复
一个递归,建议LZ自己做,应该能做出来的。
骄傲青蛙 2010-02-26
  • 打赏
  • 举报
回复
引用 3 楼 foolbirdflyfirst 的回复:
如果按你这种设计,只能递归一层层找
如果你加个字段,记录本节点的所有子节点,就极其好办了,但是需要你在数据添加/删除时要做处理,更新上级节点的子节点信息.


第二种方法操作上好像很麻烦, 有没人这样做过的? 或除了第一种以外更好的设计。
vgy12304 2010-02-26
  • 打赏
  • 举报
回复
回2楼的,你搞错了,我将的是数据结构,不是实现特效

回3楼的,我是在子分类加路径实现的,跟你说的差不多,需要不停级别的寻址,数据少还行,数据多的话,就服务器就拖死了

foolbirdflyfirst 2010-02-25
  • 打赏
  • 举报
回复
如果按你这种设计,只能递归一层层找
如果你加个字段,记录本节点的所有子节点,就极其好办了,但是需要你在数据添加/删除时要做处理,更新上级节点的子节点信息.
wellwl 2010-02-25
  • 打赏
  • 举报
回复
first.php?id=* 是根据id返回的一个combox,
上面代码少了一些
<script type="text/javascript">
$(function(){
$("#select1").click(function(){
$("#div1").load("1st.php?id="+$("#select1").val());
}) ;
$("#select2").click(function(){
$("#div2").load("2nd.php?id="+$("#select2").val());
}) ;
$("#select3").click(function(){
$("#div3").load("3th.php?id="+$("#select3").val());
}) ;
………………
})
</script>

<select name="select1" id="select1" >
</select>
<div id="div1"><select name="select2" id="select2" >
</select></div>

其中1st.php?id=^ 返回 的内容是<select name="select2" id="select2" >
</select>

依次往下……
wellwl 2010-02-25
  • 打赏
  • 举报
回复
用 JQUERY 可简单,实现无限级联动,
<script type="text/javascript" src="../../include/js/jquery-1.3.2.min.js"></script>

<script type="text/javascript">
$(function(){
$("#a").load("first.php?id="+$("#a").val());
})
</script>
异步调用,这样有多少分类,就 有多少个php文件,我是这样搞的,因为我经常用jquery.js

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧