我正在尝试在这里构建面包屑,但遇到了一些麻烦。问题是由于我必须保存类别名称(两种语言)、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/