【问题标题】:Trouble retrieving products under a complex category structure in PHP在 PHP 中检索复杂类别结构下的产品时遇到问题
【发布时间】:2010-07-28 22:30:31
【问题描述】:

我希望你们能帮助我解决这个问题。所以,我有一个产品表和一个类别表。类别表的结构如下所示。将有大约 20 个类别,深度为三到四级。为了获得类别树,编写了一个递归函数,它工作正常。

我的新任务是显示给定类别的产品。例如,我将使用下面显示的数据。因此,如果我添加 category_id = 7 的产品,我必须在用户选择类别 7 时显示该产品,而且当用户选择类别 4 或类别 1 时也必须显示该产品。此外,如果用户选择 id = 1 的类别,它必须显示类别 = 1、4、5、6 的产品。

我的类别表如下所示:

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 

【问题讨论】:

    标签: php mysql recursion


    【解决方案1】:

    在类似的情况下,我创建了一个递归函数,它将获取一个类别的所有子项以及该类别本身。那么你可以简单地说

    WHERE category in (cat1, cat2, ...)
    

    在 SQL 中

    更新

    你想要一个函数 getChildren 产生,比如说 1,结果 [1,4,5,6,7]

    那么你的查询是

    WHERE category in (1,4,5,6,7)
    

    这是一种简写方式

    WHERE category=1 OR category=4 OR category=5 ...
    

    因此,即使产品只附有一个类别 ID,这确实是可以找到产品的语句

    【讨论】:

    • 我不确定这是一个好主意,因为我只会为该产品存储一个类别。例如,我只存储“6”,但即使选择“1”类别,也必须显示产品。
    • 哦,我现在明白了。可能会奏效。会试一试。谢谢。
    【解决方案2】:

    我会这样做:

    1. ... WHERE category_id = n OR category_parent = n:选择当前类别(n 为当前)及其一级子类别。如果您想要更深的层,则需要向下递归这些层。
    2. ... WHERE category_id = p:选择父类别(p 是父 ID)。重复直到 p 为 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 2021-12-31
      • 2015-09-15
      • 2021-09-21
      • 2019-06-20
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      相关资源
      最近更新 更多