实现mysql无限分类的方法综述

实现mysql无限分类的方法综述
无限分类是PHP如何与MySQL结合的老话题。

第一种方法

这是一种非常常见的传统方法,首先查看表结构。

表:catery

id主键,自增

名称varchar分类名称

默认的父类ID,默认为0

的顶级PID的默认值是0。当我们想拿出来的子分类树的分类,其基本思想是递归的,当然,这个问题是不推荐用于每个递归查询数据库的效率,通常的做法是谈都采取了分类,保存在PHP数组,然后进行处理,最后还可以缓存结果提高效率的下一个请求。

首先,构建一个原始数组,该数组直接从数据库中提取出来。

复制代码代码如下所示:

美元=阵列(伙伴关系

阵列('id' = > 1,'name' = >计算机,'pid= > 0),

阵列('id' = > 2,'name' = > 'cell电话,'pid= > 0),

阵列('id' = > 3,'name' = > 'notebook,'pid= > 1),

阵列('id' = > 4,'name' = > 'desktop,'pid= > 1),

阵列('id' = > 5,'name' = > 'smartphones,'pid= > 2),

阵列('id' = > 6,'name' = > 'function,'pid= > 2),

阵列('id' = > 7,'name' = > 'superbook,'pid= > 3),

阵列('id' = > 8,'name' = > 'games ','pid= > 3),

);
目标是将其转换为以下结构

电脑

笔记



游戏

台式机

移动电话

智能

功能

在一个数组中,你可以添加一个孩子关键存储它的子类:

复制代码代码如下所示:

(阵列

1对应id,并且易于阅读。

(数组> 1)

id = 1,

名字= > 'computers,

PID=0,

子数组(

(阵列

id = 3,

名字= > 'notebook,

PID=1,

子数组(

在这里省略



),

(阵列

id = 4,

名字= > 'desktop,

PID=1,

子数组(

在这里省略



),



),

其他分类/省略


过程:

复制代码代码如下所示:

树=数组();

第一步,将其归类为id数组键,并创建一个子单元。

foreach(合伙伴关系catery美元){

美元树{ $ catery { 'id' } } = $ catery;

美元树{ $ catery { } } { 'id'‘孩子'} =阵();

}

通过引用,每个分类都添加到父类子数组中,这样的遍历可以形成树结构。

foreach(美元美元美元树K = >项目){

如果($项{ 'pid}!= 0){

美元树{ $项{ } } { 'pid '孩子' } { } = { } $ K $树;

}

}

print_r(美元树);
打印结果如下:

复制代码代码如下所示:

阵列



{ 1 }数组



{ 1

{计算机

{ 0

{子数组



{ 0 }数组



{ 3

{笔记本

{ 1

{子数组



{ 0 }数组



{ 7

{这个超级的名字

{ 3

{子数组







{ 1 }数组



{ 8

{此游戏

{ 3

{子数组











{ 1 }数组



{ 4

{桌面

{ 1

{子数组











{ 2 }数组



{ 2

{移动电话

{ 0

{子数组



{ 0 }数组



{ 5

{智能机器

{ 2

{子数组







{ 1 }数组



{ 6

{函数机器

{ 2

{子数组











{ 3 }数组



{ 3

{笔记本

{ 1

{子数组



{ 0 }数组



{ 7

{这个超级的名字

{ 3

{子数组







{ 1 }数组



{ 8

{此游戏

{ 3

{子数组











{ 4 }数组



{ 4

{桌面

{ 1

{子数组







{ 5 }数组



{ 5

{智能机器

{ 2

{子数组







{ 6 }数组



{ 6

{函数机器

{ 2

{子数组







{ 7 }数组



{ 7

{这个超级的名字

{ 3

{子数组







{ 8 }数组



{ 8

{此游戏

{ 3

{子数组








优点:关系清晰,很容易修改上下级关系。

缺点:使用PHP处理,如果分类数量庞大,效率就会降低。

第二方法

此方法是在表字段中添加一个路径字段:

表:catery

id主键,自增

名称varchar分类名称

默认的父类ID,默认为0

路径varchar路径

样本数据:

id路径

1计算机00

2手机00

3笔记本10-1

4超3的三

5游戏书3三

路径字段记录从根分类法到上层父类的路径,它用+表示。

这样,假设我们需要查询计算机下的所有子代,只有一个SQL语句:

Select id, name path, from catery where path like (select concat (path, -, ID, as path from catery where '%') id=1);

结果uff1a

+ -- + + + ----------- -------

ID名称路径| | | |

+ -- + + + ----------- -------

| 3 |笔记本| 0-1 |

4 | |超级|三|

5游戏的| | |三|

+ -- + + + ----------- -------

这种方法也被很多人采纳,我总结如下:

优点:查询方便,效率高,路径字段可索引。

缺点:更新节点关系故障,需要更新路径域的所有子节点。

以上就是本文的全部内容,两种方式,你喜欢哪种我希望你能喜欢它。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部