mysql无限分类


无限级分类(或菜单)的高性能实现思路

一般说到无限级分类、菜单之类的东西,大家 (我) 的数据表设计一般是这样的

idparent_idtitle更多字段…
10衣物 
21上衣 
31裤子 
43西裤 
54长西裤 
64短西裤 
72衬衫 

其中,parent_id表示父分类的id。由此可知,衣物分类下有上衣和裤子两个二级分类;而裤子还有西裤这个三级分类……以此类推

这种设计比较常见 (就我所知),但缺点很明显。
例如需要显示下面这样的面包屑导航时:
衣物 > 裤子 > 西裤
就不得不进行多次循环

再例如,需要显示所有分类并表示层级时:

也不得不进行多次循环

那么,如何快速实现上述的常见功能呢?

实现
首先,示例表设计:

idtitlepathlevel更多字段…
1衣物00 
2上衣0,11 
3裤子0,11 
4西裤0,1,32 
5长西裤0,1,3,43 
6短西裤0,1,3,43 
7衬衫0,1,22 

其中,path表示父级id列表。例如西裤的0,1,3就表示衣物 > 裤子
实现面包屑时只要取出path字段的值,然后用,分割,得到id列表
再用where id in (1,3)即可

需要显示所有分类并表示层级时,使用下面的SQL:

SELECT *,concat(path,',',id) AS paths FROM menu ORDER BY paths

看到的结果是这样的:

idtitlepathlevelpaths
1衣物000,1
2上衣0,110,1,2
7衬衫0,1,220,1,2,7
3裤子0,110,1,3
4西裤0,1,320,1,3,4
5长西裤0,1,3,430,1,3,4,5
6短西裤0,1,3,430,1,3,4,6

那么,直接取出结果输出即可。level字段就是层级的意思
例如在PHP中,可以用str_repeat('--> ', $level)直接输出表示层级的前缀
并且连顺序都排好了,是不是很方便呢?

 

/**
 * @param $data
 * @param $parent_id
 * @return array
 * 树状数据  还是加上父类id吧T_T
 */
function getTree($data, $parent_id)
{
    $tree = array();
    foreach ($data as $k => $v) {
        if ($v->parent_id == $parent_id) {

            $v->sun = getTree($data, $v->id);
            $tree[] = $v;

        }
    }

    return $tree;
}

作者介绍

Image Description

zfajax舫

小时候的梦想是当宇航员,长大的梦想是在北京买套90㎡房的小站长、自媒体人,2014年毕业,后从事过网站开发搭建工作;2016年,创建了张舫博客;20015-至今在北京工作(微信:a7983310)

评论列表

还没有人评论,抢占前排沙发

发表评论

关于作者

Image Description

zfajax舫

小时候的梦想是当宇航员,长大的梦想是在北京买套90㎡房的小站长、自媒体人,2014年毕业,后从事过网站开发搭建工作;2016年,创建了张舫博客;20015-至今在北京工作(微信:a7983310)

关注作者

Social Links

定制项目外包

Unit 25 Suite 3, 925 Prospect PI,
Beach Resort, 23001

手机号码

18600004319