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


Nested Model Menu on E-Commerce Site

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

现在我的问题是,我希望能够只显示类别下有产品。例如,如果我创建类别food和子类别adult。那么系统不应该在任何物种下列出分类。但是,一旦我在adult类别下创建了一个产品,系统应该列出Food和子Adult

当前表的结构如下:

类别:

  • id
  • 顶部
  • <
  • 名称/gh>
  • 融通的
  • 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}

然后执行一个查询来获取所有类别及其左、右。我可以从。

应该这样做:

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

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

您将需要匹配字段并编写输出的其余代码,但这应该是您的开始。您还需要更改a.*以列出正在使用的所有字段,以进行更好的优化。

编辑:

我明白你想要完成什么,但我仍然不明白你的数据库结构。对于第一级的子类别,我会这样做:

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查询!

  • 一个是物种列表。
  • 一个用于所有的类别里面的产品。
  • 我循环查找一个的所有类别的一个

迎接下一个挑战!