愤怒的小菜

小菜的成长博客

左右值排序无限分类算法

传统的无限分类方法:

1.通过存储父级id采用遍历的方式查询数据 

2.通过存储id层次路径的方式查询数据(但是要使用like来查询).

左右值方法:



将上面的只有值存储为mysql的数据,例如我们要查询出‘AA1’分类下的数据这时候只要left>=10 and right<=15.



与其他数据结构相比在查询效率上会明显提高,但插入和删除操作需要重新的计算对应的左右值。一般分类不会频繁的改动,还是可以接受的。

下面是一些例子:

// 打印分类的树形结构

//    ps:查询出大于父分类左值并且小于父分类右值的分类为该分类下的子分类并且按左值升序排序

 $lft = 1;

 $rgt = 999;

 $sql = " SELECT * FROM `xiaocai_class` WHERE `left`>={$lft} AND `right`<={$rgt} ORDER BY `left` ASC";

 $result = mysql_query($sql,$conn);

 $right  = array();

while ($row = mysql_fetch_array($result)) {

if(count($right)){

while( $right[count($right) -1] < $row['right'] ){

array_pop($right);

 }

echo str_repeat('&nbsp;&nbsp;', count($right)).'┠ '.$row['name'].'<br>';

}else{

echo '┠ '.$row['name'].'<br>';

}

$right[] = $row['right'];

 }

// 新增子分类

//    ps:把大于父分类左值的分类的左右值+2,并且插入新分类的左右分别为父分类的左值+1和+2

$sql1 = " UPDATE `xiaocai_class` SET `left`=`left`+2 WHERE `left`>{$lft}  ";  

$sql2 = " UPDATE `xiaocai_class` SET `right`=`right`+2 WHERE `right`>={$lft} ";  

$sql3 = " INSERT INTO `xiaocai_class` SET `name`='AA3',`left`={$lft}+1,`right`={$lft}+2 ";

//删除分类

// ps:删除左右值在本分类之间的分类,并且修改大于本分类右值的所有节点他们的左右值都减去right-left + 1

$lft  = 6;

$rgt  = 7;

$val  = $rgt - $lft + 1;

$sql1 = " DELETE FROM `xiaocai_class` WHERE `left`>= {$lft} AND `right`<= {$rgt} ";

$sql2 = " UPDATE `xiaocai_class` SET `left`=`left`-{$val} WHERE `left`> {$lft} ";

$sql3 = " UPDATE `xiaocai_class` SET `right`=`right`-{$val} WHERE `right`< {$rgt} ";

//  获得某分类下的子分类

//    ps:查询出大于父分类左值并且小于父分类右值的分类为该分类下的子分类

$sql = "  SELECT * FROM `xiaocai_class` WHERE `left`> 1 AND `right`< 10 ";

//获得某分类下的子分类数量

$num = ($rgt-$lft-1)/2;




评论

© 愤怒的小菜 | Powered by LOFTER