【问题标题】:Trying to get the path to a node with PHP & MySQL尝试使用 PHP & MySQL 获取节点的路径
【发布时间】:2010-08-14 16:07:36
【问题描述】:

我正在尝试在这里建立一个面包屑,但我在做这件事时遇到了一些麻烦。问题源于我必须保存类别名称(两种语言)、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 表进行任何更改。

我想要完成的是建立一个像这样的面包屑:

主页 > 类别 1 > 类别 1.1 > 类别 1.1.2

谁能提供一小段代码来说明如何做到这一点? 我已经尝试过here 中的“节点路径”代码,但是,正如我所说,我必须在该数组中包含 category_name、category_slug、category_description_ro 和 category_description_en。 提前谢谢各位。

【问题讨论】:

    标签: php mysql recursion


    【解决方案1】:

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

    某些 DBMS,例如 SQL Server 2005、Postgres 8.4 和 Oracle 11g,支持使用 common table expressionsWITH 关键字的递归查询。这个特性使得这样的查询可以很容易地编写出来,但是不幸的是 MySQL 还不支持递归查询。

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

    此外,我还建议查看以下由 Stack Overflow 的定期撰稿人 @Bill Karwin 提供的演示文稿:

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

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

    【讨论】:

      【解决方案2】:

      在伪代码中:

      $currentID = 7;
      do{
          $category = getCategoryByID($currentID);
          $currentID = $category['category_parent'];
      
          $crumb .= $category['category_name'];
      }while($category['category_parent']);
      

      这只会循环备份类别树,构建 crumb 直到没有更多父级。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-12
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 2018-11-21
        • 2012-03-27
        相关资源
        最近更新 更多