无限分类是实际开发中经常用到的一种数据结构,一般我们称之为树形结构。
<FONT style="COLOR: #ff0000">题设:类似淘宝的商品分类,可以在任意分类设置其子类。
一、创建type 数据表
id 自增长
fid int(11) 默认(0) ,父节点id
name varchar(50),分类名称 <div class="codetitle"><a style="CURSOR: pointer" data="30689" class="copybut" id="copybut30689" onclick="doCopy('code30689')"> 代码如下:<div class="codebody" id="code30689"> CREATE TABLE type ( id int(11) NOT NULL AUTO_INCREMENT, fid int(11) NOT NULL DEFAULT '0', name varchar(50) NOT NULL, PRIMARY KEY (id ) )
二、添加
我们先添加几个顶级分类 <div class="codetitle"><a style="CURSOR: pointer" data="22403" class="copybut" id="copybut22403" onclick="doCopy('code22403')"> 代码如下:<div class="codebody" id="code22403"> INSERT INTO type (id ,fid ,name ) VALUES (NULL,'0','手机'); INSERT INTO type (id ,'电脑'); INSERT INTO type (id ,'鞋子'); INSERT INTO type (id ,'衣服');
这里fid=0是代表顶级分类接着我们为{电脑}添加几个个子分类 <div class="codetitle"><a style="CURSOR: pointer" data="377" class="copybut" id="copybut377" onclick="doCopy('code377')"> 代码如下:<div class="codebody" id="code377"> INSERT INTO type (id ,'2','台式'),(NULL,'笔记本');
这里fid=2,2这个id是分类{电脑}的id,如果是添加{鞋子}的子分类则fid=3 同理我们为{笔记本}添加子分类则fid=6 <div class="codetitle"><a style="CURSOR: pointer" data="39898" class="copybut" id="copybut39898" onclick="doCopy('code39898')"> 代码如下:<div class="codebody" id="code39898"> INSERT INTO type (id ,'6','ausu'),'hp');
三、删除
如果我们想删除{笔记本}这个分类,很简单 <div class="codetitle"><a style="CURSOR: pointer" data="21335" class="copybut" id="copybut21335" onclick="doCopy('code21335')"> 代码如下:<div class="codebody" id="code21335"> DELETE FROM type WHERE id =6
{笔记本}的子分类我们也要记得做相应的处理 <div class="codetitle"><a style="CURSOR: pointer" data="3581" class="copybut" id="copybut3581" onclick="doCopy('code3581')"> 代码如下:<div class="codebody" id="code3581"> function del($fid) { $sql="SELECT FROM type WHERE fid =$fid"; $rs=mysql_query($sql); for ($i = 0; $i < count($rs); $i++) { $sql="DELETE FROM type WHERE id ={$rs[$i]['id']}"; mysql_query($sql); del($rs['id']);//递归 } } del(6);//执行操作
这里你也许你会疑惑为什么那么麻烦用递归,而不是直接这样删除 <div class="codetitle"><a style="CURSOR: pointer" data="30285" class="copybut" id="copybut30285" onclick="doCopy('code30285')"> 代码如下:<div class="codebody" id="code30285"> DELETE FROM type WHERE fid =6
这样我们不就可以直接删除{ausu}、{hp}?但是假设{ausu}有一个子分类{a1},{a1}也有一个子分类{a2},如果不用递归我们就无法彻底删除数据。三、查找
<FONT style="COLOR: #ff0000">1.查找{电脑}的子分类 <div class="codetitle"><a style="CURSOR: pointer" data="50175" class="copybut" id="copybut50175" onclick="doCopy('code50175')"> 代码如下:<div class="codebody" id="code50175"> SELECT FROM type WHERE fid =2
<FONT style="COLOR: #ff0000">2.查找{电脑}的所有子分类 <div class="codetitle"><a style="CURSOR: pointer" data="17063" class="copybut" id="copybut17063" onclick="doCopy('code17063')"> 代码如下:<div class="codebody" id="code17063"> function sel($fid) { $sql="SELECT FROM type WHERE fid =$fid"; $rs=mysql_query($sql); for ($i = 0; $i < count($rs); $i++) { echo $rs[$i]['name']; sel($rs[$i]['id']);//递归 } } sel(2);
四、实际数据应用
在数据表添加一个字段tid ,字段值为记录所属分类type 表的id。必须是id不能是name,因为name的值可能会改变。 例如查询属于{电脑}分类的商品 <div class="codetitle"><a style="CURSOR: pointer" data="16399" class="copybut" id="copybut16399" onclick="doCopy('code16399')"> 代码如下:<div class="codebody" id="code16399"> SELECT FROM goods WHERE tid =2
<FONT style="COLOR: #ff0000">注:代码没有运行过可能会有错误,但是思路是正确的,主要的是理解树形结构,而不是记住代码。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|