无限级分类的表结构和数据读取方法
特点: 不用循环或者递归操作数据库, 一次读出, 节省库资源
表结构
CREATE TABLE `my_class` (
`id` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`parentid` SMALLINT( 5 ) UNSIGNED NOT NULL ,
`classname` VARCHAR( 20 ) NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;
测试数据:
INSERT INTO `my_class` VALUES (1, 0, '中国');
INSERT INTO `my_class` VALUES (2, 1, '江苏');
INSERT INTO `my_class` VALUES (3, 2, '苏州');
INSERT INTO `my_class` VALUES (4, 2, '南京');
INSERT INTO `my_class` VALUES (5, 1, '河南');
INSERT INTO `my_class` VALUES (6, 5, '郑州');
INSERT INTO `my_class` VALUES (7, 5, '洛阳');
INSERT INTO `my_class` VALUES (8, 0, '美国');
INSERT INTO `my_class` VALUES (9, 8, '加州');
INSERT INTO `my_class` VALUES (10, 9, '圣路易斯');
INSERT INTO `my_class` VALUES (11, 9, '萨克拉门托');
实例:
读出洛阳市的所有父级
---------------- test.php?id=7 -------------------
引用:
?php
$conn = mysql_connect("localhost","root","");
mysql_select_db("test",$conn);
mysql_query("SET @id =$_GET[id], @idStr = '',@nameStr = ''");
mysql_query("SELECT @idStr := if( id = @id , concat( @idStr , '|', id ) , @idStr ) ,
@nameStr := if( id = @id , concat( @nameStr , '|', classname ) , @nameStr ) ,
@id := if( id = @id , parentid, @id )
FROM my_class ORDER BY id DESC");
$rs = mysql_query("SELECT @idStr , @nameStr ");
$row = mysql_fetch_row($rs);
echo $row[0]." ".$row[1];
?>
读出两个字串
|7|5|1
|洛阳|河南|中国
拆解为ID和分类名数组:
引用:
?php
$row[0] = substr($row[0], 1);
$row[1] = substr($row[1], 1);
$ids = explode("|",$row[0]);
$names = explode("|",$row[1]);
$idnum = count($ids);
?>
根据上面的结果生成的导航条:
引用:
?php
for($i=$idnum-1;$i>=0;$i--){
echo" > $names[$i]";
}
?>
表结构
CREATE TABLE `my_class` (
`id` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`parentid` SMALLINT( 5 ) UNSIGNED NOT NULL ,
`classname` VARCHAR( 20 ) NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;
测试数据:
INSERT INTO `my_class` VALUES (1, 0, '中国');
INSERT INTO `my_class` VALUES (2, 1, '江苏');
INSERT INTO `my_class` VALUES (3, 2, '苏州');
INSERT INTO `my_class` VALUES (4, 2, '南京');
INSERT INTO `my_class` VALUES (5, 1, '河南');
INSERT INTO `my_class` VALUES (6, 5, '郑州');
INSERT INTO `my_class` VALUES (7, 5, '洛阳');
INSERT INTO `my_class` VALUES (8, 0, '美国');
INSERT INTO `my_class` VALUES (9, 8, '加州');
INSERT INTO `my_class` VALUES (10, 9, '圣路易斯');
INSERT INTO `my_class` VALUES (11, 9, '萨克拉门托');
实例:
读出洛阳市的所有父级
---------------- test.php?id=7 -------------------
引用:
?php
$conn = mysql_connect("localhost","root","");
mysql_select_db("test",$conn);
mysql_query("SET @id =$_GET[id], @idStr = '',@nameStr = ''");
mysql_query("SELECT @idStr := if( id = @id , concat( @idStr , '|', id ) , @idStr ) ,
@nameStr := if( id = @id , concat( @nameStr , '|', classname ) , @nameStr ) ,
@id := if( id = @id , parentid, @id )
FROM my_class ORDER BY id DESC");
$rs = mysql_query("SELECT @idStr , @nameStr ");
$row = mysql_fetch_row($rs);
echo $row[0]." ".$row[1];
?>
读出两个字串
|7|5|1
|洛阳|河南|中国
拆解为ID和分类名数组:
引用:
?php
$row[0] = substr($row[0], 1);
$row[1] = substr($row[1], 1);
$ids = explode("|",$row[0]);
$names = explode("|",$row[1]);
$idnum = count($ids);
?>
根据上面的结果生成的导航条:
引用:
?php
for($i=$idnum-1;$i>=0;$i--){
echo" > $names[$i]";
}
?>

