MySQL无限极分类实现与技巧(mysql无限极分类)
MySQL无限极分类实现与技巧
MySQL无限极分类是为大规模互联网应用设计的一种分类方法,无限极分类的关键是采用结构化的路径进行组织。比如常见的CMS系统,允许分类层级可以延伸到任意深度。
无限极分类数据库表结构是管理无限极分类系统必不可少的部分,多数情况下,使用MySQL实现无限极分类时,表结构至少需要包含以下3个字段:
**字段名称** | **数据类型** | **描述**
—|—|—
id | int | 唯一标识
name | varchar(20) | 名称
parentId | int | 父级编号
通过定义这3个字段,就可以实现一个无限极分类的表结构:
**id** | **name** | **parentId**
—|—|—-
1 | 默认分类 | 0
2 | 技术分类 | 1
3 | 前端技术 | 2
4 | 后端技术 | 2
5 | PHP | 4
6 | Java | 4
从表结构可以看出,parentId=0的记录为顶级分类,下属parentId不为0的分类是子级分类。
接下来就是使用MySQL进行无限极分类查询了,MySQL提供了一个特殊的关键字:self joins,也就是自连接,可以让表自引用它本身字段,如以上分类表可以使用下面的SQL语句来查询所有的子级分类:
“`sql
SELECT c1.id, c1.name
FROM category as c1,category as c2
WHERE c1.parentId = c2.id
作为分类查询的终极技巧,可以使用一个递归函数,这将极大提高查询性能,把目标分类放到函数中,然后它就可以自动递归查找出所有的子级分类。例如利用MySQL自带的存储过程和函数,可以编写出一个递归函数来查询某个分类的子级分类:
```SQLCREATE PROCEDURE getChildCategorys(in parent_id int, out child_ids text)
BEGIN declare child_id int default 0;
declare child_ = ""; declare done int;
declare c cursor for select id from category where parentId = parent_id;
declare continue handler for not found set done = 1; open c;
repeat fetch c into child_id;
if not done then set child_= concat(child_, ",", child_id);
call getChildCategorys(child_id, @tmp); set child_ = concat(child_, @tmp);
end if; until done end repeat;
close c; set child_ids = child_;
END
最后,需要将上面的递归函数调用:
“`SQL
call getChildCategorys(2, @ids);
select @ids;
以上就是MySQL无限极分类的实现与技巧,使用MySQL的特有的关键字和函数可以使我们实现更高效的查询,有助于我们搭建出天然能支持无限极分类的数据结构。