php - MySQL分层存储: searching through all parent/grandparent/etc.节点给定子节点id?

标签 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  | 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

在搜索任何此类数据时,我想找到所有子/孙/曾孙等节点。因此,如果有人想查看所有“汽车”,他们会看到 parent_id 为“Hatchbacks”的所有内容,以及 parent_id 为“Peugeot”的所有内容,依此类推,达到任意级别。

因此,如果我列出了 category_id 为 1、3、6 或 8 的“真正快速的 Peugeot 206”,我的查询应该能够“向上移动”树并找到任何更高的类别,即 parent /祖 parent 该子类别的。例如。搜索类别“8”中的 Peugeots 的用户应该会找到任何列有类别 6、3 或 1 的 Peugeots - 所有这些都是类别 8 的后代。

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

抱歉,如果我没有解释清楚。它很难!不过谢谢你。

注意:我已阅读 the MySQL dev article on hierarchies .

最佳答案

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

只需将您的类别的“路径”存储在类别表中。像这样: path =/1/3/4 并且当像“select .... where path like '/1/3/%'”这样查询你的数据库时,它将比多层次查询更简单和快速......

关于php - MySQL分层存储: searching through all parent/grandparent/etc.节点给定子节点id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5749385/

相关文章:

iphone - 如何在UIViewController中设置parentViewController?

c# - EF : using typeid map entity framework hierarchy

php 正则表达式文件路径 |特定字符后的第二个匹配

mysql - 如何导入示例数据库sakila,mysql

mysql - 组合四个表 - MySQL

php - 如何在 1 行上显示数据库中的数据

sql - 使用CTE的相邻列表和递归查询,如何回填?

php - 从 PHP SoapServer 返回一个 PHP 数组

php - 在 WordPress 模板中显示条件内容

php - 我在 php 上使用 ajax 发送的值时总是出现错误