php - 尝试使用 PHP 和 MySQL 获取节点的路径

标签 php mysql recursion

我正在尝试在这里构建面包屑,但遇到了一些麻烦。问题是由于我必须保存类别名称(两种语言)、slug 和 id。

我的类别表如下所示:

CREATE TABLE `categories` (
 `category_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
 `category_name` varchar(256) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `category_slug` varchar(256) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `category_parent` smallint(5) unsigned NOT NULL DEFAULT '0',
 `category_description_ro` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `category_description_en` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`category_id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=latin1

下面是表中数据的示例:

category id | category name | category_parent

1            Categoria 1            0        
2            Categoria 2            0        
3            Categoria 3            0        
4            Categoria 1.1          1        
5            Categoria 1.2          1        
6            Categoria 1.3          1        
7            Categoria 1.1.2        4 

我不得不提一下,我无法对 MySQL 表进行任何更改。

我想要完成的是构建一个面包屑,例如:

Home > Categoria 1 > Categoria 1.1 > Categoria 1.1.2

任何人都可以提供一小段代码来说明如何执行此操作吗? 我已经尝试过 here 中的“节点路径”代码,但是,正如我所说,我必须在该数组中包含category_name、category_slug、category_description_ro 和category_description_en。 预先感谢各位。

最佳答案

您正在使用adjacency list model组织您的分层数据。 。这种递归操作的困难实际上是该模型的一个主要缺点。

某些 DBMS,例如 SQL Server 2005、Postgres 8.4 和 Oracle 11g,支持使用 common table expressions 进行递归查询。使用 WITH 关键字。这个特性允许轻松编写这样的查询,但不幸的是 MySQL 还不支持递归查询。

您提到您无法对表格进行任何更改,但是可以添加额外的表格吗?如果是,您可能有兴趣查看以下文章,其中描述了替代模型( nested set model ),它使递归操作变得更容易(可能):

此外,我还建议您查看以下 @Bill Karwin 的演示,Stack Overflow 的定期贡献者:

演示中描述的闭包表模型是嵌套集的非常有效的替代方案。他在他的 SQL Antipatterns 中进一步描述了这个模型。书(excerpt from the chapter on this topic)。

否则,您可能希望在应用程序中以 php 形式执行递归部分,如 @geon suggested在另一个答案中。

关于php - 尝试使用 PHP 和 MySQL 获取节点的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3484114/

相关文章:

php - 如何从 MySQL 数据库中获取今天/昨天的数据?

javascript - 递归问题。如何解决这个问题?

c++ - C++ 中的递归子串反转

java - 递归打印矩阵中的所有路径

php - CakePHP 1.3 : High CPU Usage

php 点和 mysql 点不匹配

php - 多个插入不适用于SQLite 3

php - 如何使用 php 删除 json 响应中的反斜杠 ("\")?

mysql - InnoDB + innodb_file_per_table : Configurable extent size to avoid wasted disk space?

使用表 1 中的值从表 2 中进行 MySQL 查询