Php 电子商务网站上的嵌套模型菜单

Php 电子商务网站上的嵌套模型菜单,php,mysql,sql,menu,Php,Mysql,Sql,Menu,我有一个数据库,其中有一个类别表,使用MySql中的嵌套方法。但我总是碰壁。该网站包含部分物种,因为这是一家宠物店。我已经有了一个查询,它返回了每个物种中包含产品的所有类别 现在我的问题是,我希望能够只显示在它们下面有产品的类别。举个例子,如果我和一个儿童成人一起创建食品类别。然后,系统不应将该类别列在任何物种下。但一旦我在成人类别下创建了一个产品,系统就会列出儿童和成人的食物 该表目前的结构如下: 类别: 身份证件 顶部 名称 lft rgt 为了完整而创建 为完整起见,最后更新 因此,我能够

我有一个数据库,其中有一个类别表,使用MySql中的嵌套方法。但我总是碰壁。该网站包含部分物种,因为这是一家宠物店。我已经有了一个查询,它返回了每个物种中包含产品的所有类别

现在我的问题是,我希望能够只显示在它们下面有产品的类别。举个例子,如果我和一个儿童成人一起创建食品类别。然后,系统不应将该类别列在任何物种下。但一旦我在成人类别下创建了一个产品,系统就会列出儿童和成人的食物

该表目前的结构如下:

类别:

身份证件 顶部 名称 lft rgt 为了完整而创建 为完整起见,最后更新 因此,我能够从表中为每个物种构建一棵完整的树,但我需要的是,只有当它们为该物种提供了产品时,类别才可见

听起来很简单,但出于某种原因,我的大脑无法理解这一点。有什么帮助吗?最好的方法是什么

更新:

我用于获取类别的查询:

SELECT node.id as nid, node.top as top, node.*, brands.name as brandname from
brands, foods, foodcategories, categories as node, categories as parent WHERE 
node.lft BETWEEN parent.lft AND parent.rgt AND parent.top=1 AND 
foodcategories.food=foods.id AND foodcategories.category=node.id 
AND brands.id=foods.brand AND foods.species={speciesid}

然后我执行一个查询,以获取所有类别及其lft、rgt。我可以用它来构建树。

类似这样的东西应该可以:

$q = mysql_query("SELECT a.* FROM Categories a WHERE a.id IN (SELECT categoryID FROM Products)");

您需要匹配字段并将其余代码写入输出,但这应该可以让您开始。您还需要更改*以列出所有用于更好优化的字段

编辑:

我想我理解您试图实现的目标,但仍然不理解您的数据库结构。对于1级子类别,我将执行以下操作:

echo '<ul>';
$q = mysql_query("SELECT a.* FROM Categories a, SubCategories b WHERE a.ID = b.categoryID AND (SELECT count(*) FROM Products WHERE SubCategoryID = b.id) >= 1");
while($f = mysql_fetch_array($q)) {
    echo '<li>'.$f['Category'];
    $qsc = mysql_query("SELECT b.* FROM SubCategories b WHERE (SELECT count(*) FROM Products WHERE SubCategoryID = b.id) >= 1");
    if (mysql_num_rows($qsc) > 0) {
        echo '<ul>';
    }
    while($fsc = mysql_fetch_array($fsc)) {
        echo '<li>'.$fsc['SubCategory'].'</li>';
    }
    if (mysql_num_rows($qsc) > 0) {
        echo '</ul>';
    }   
    echo '</li>';   
}
echo '</ul>';

您可以将其应用到您的代码中,或者如果您对数据库结构进行更多的解释,我可以进一步提供帮助

经过几天的努力,终于想出了一个解决方案并付诸实施

我可以执行下面的查询,并获得一个类别的完整路径

(SELECT cast(group_concat(parent.id SEPARATOR '-') AS char) as catpath
            FROM categories AS node,
                    categories AS parent
            WHERE node.lft BETWEEN parent.lft AND parent.rgt
                    AND node.id=categories.id
            ORDER BY node.lft )
然后我想,如果我可以这样做,为什么不在类别查询中包含这个路径呢。因此,当我检索包含产品的类别时,我可以简单地解析这个字符串,并将id与我也检索的类别列表相匹配

这是相当多的循环。所以我缓存菜单,每5分钟只生成一次

就这样!3个查询

一个是物种列表。 一个用于所有具有 其中的产品。 一个用于我循环查找的所有类别 有一定的身份证。
进入下一个挑战

请包括你的查询,这几乎是,但不是很有效。嗨,将包括它,但这不是问题,它是返回所有的类别,我可以把他们放在一个树与他们的左右列。它将提供一个起点的答案,它没有乐趣梦想从零开始查询。杜托伊特,南非?我喜欢南非。哇,是的,南非,你知道,就凭我的姓氏:0……我用一些类似的东西来获得产品的类别,是的。但是我怎样才能重建类别的树+它的子级和父级?你能更清楚地知道没有过滤器的输出是什么,以及预期的输出是什么吗?我有多个级别的类别。所以食物->成人->非常成人->大。然后,如果我把产品放在大类中,我希望能够生成整个树,这样我就可以显示一个下拉列表。
(SELECT cast(group_concat(parent.id SEPARATOR '-') AS char) as catpath
            FROM categories AS node,
                    categories AS parent
            WHERE node.lft BETWEEN parent.lft AND parent.rgt
                    AND node.id=categories.id
            ORDER BY node.lft )