Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL分层存储:在给定子节点id的所有父/祖父母/等节点中搜索?_Php_Mysql_Hierarchy_Hierarchical Data - Fatal编程技术网

Php MySQL分层存储:在给定子节点id的所有父/祖父母/等节点中搜索?

Php MySQL分层存储:在给定子节点id的所有父/祖父母/等节点中搜索?,php,mysql,hierarchy,hierarchical-data,Php,Mysql,Hierarchy,Hierarchical Data,我使用分层模型存储类别,如下所示: CATEGORIES id | parent_id | name --------------------- 1 | 0 | Cars 2 | 0 | Planes 3 | 1 | Hatchbacks 4 | 1 | Convertibles 5 | 2 | Jets 6 | 3 | Peugeot 7 | 3 | BMW 8 |

我使用分层模型存储类别,如下所示:

CATEGORIES
id | parent_id | name
---------------------
1  | 0         | Cars
2  | 0         | Planes
3  | 1         | Hatchbacks
4  | 1         | Convertibles
5  | 2         | Jets
6  | 3         | Peugeot
7  | 3         | BMW
8  | 6         | 206
9  | 6         | 306
然后,我使用以下类别ID之一存储实际数据,如下所示:

CARS
vehicle_id | category_id | name
-------------------------------
1          | 8           | Really fast silver Peugeot 206 
2          | 9           | Really fast silver Peugeot 306 
3          | 5           | Really fast Boeing 747
4          | 3           | Another Peugeot but only in Hatchbacks category
在搜索任何此类数据时,我希望找到所有子/孙/曾孙等节点。因此,如果有人想看到所有的“汽车”,他们会看到所有带有“掀背车”家长id的东西,以及所有带有“标致”家长id的东西,等等,达到任意的水平

因此,如果我列出一个类别id为1、3、6或8的“极快标致206”,我的查询应该能够“向上”树,并找到属于该子类别的父母/祖父母的任何更高类别。例如,在“8”类中搜索标致的用户应能找到第6类、第3类或第1类中列出的任何标致-所有这些都是第8类的后代

例如,使用上述数据,搜索类别3中的“标致”实际上应该会找到车辆1、2和4,因为车辆1和2有一个类别祖先轨迹,可以返回到类别3。看到了吗

对不起,如果我没有解释清楚的话。这很难!不过谢谢你


注意:我已经读过。

这篇文章可以帮助您

规范化模型很好,但当您实际需要查询它们时就不行了


只需将类别的“路径”存储在类别表中。如下所示:path=/1/3/4,当查询数据库时,如“select….where path Like'/1/3/%”,它将比多层次查询更简单、更快速……

我喜欢SitePoint提供的解释。它为您提供代码并解释其背后的理论


注意:此方法用于读取比用于写入更好。如果你不停地在树上写东西,我会使用不同的算法。此方法针对读取(查找)进行了优化。

您已将数据表示为邻接列表模型,其。现在,这不是唯一的办法。对于您的特定问题,我可能会使用一种方法,即取消实际类别表,而是在您的cars表中有一个列,在每个记录的基础上看起来像
cars/Hatchbacks/Peugeot
,并使用
like
查询。不幸的是,随着记录数量的增加,这将是缓慢的。现在,如果您知道层次结构的最大深度(例如四个级别),您可以将其分解为单独的列,这样您就可以利用索引

由于MySQL不支持层次结构,这将使MySQL变得混乱和笨拙queries@a_horse_with_no_name:似乎使用了与我使用的相同的存储方法,并且看起来工作正常。还是我遗漏了什么?这有帮助吗?这篇文章的要点不是使用“分层”模型,而是使用嵌套集模型(不需要DBMS支持分层查询)。MySQL可以支持邻接列表模型,请参见我的答案。