Php 电子商务网站上的嵌套模型菜单
我有一个数据库,其中有一个类别表,使用MySql中的嵌套方法。但我总是碰壁。该网站包含部分物种,因为这是一家宠物店。我已经有了一个查询,它返回了每个物种中包含产品的所有类别 现在我的问题是,我希望能够只显示在它们下面有产品的类别。举个例子,如果我和一个儿童成人一起创建食品类别。然后,系统不应将该类别列在任何物种下。但一旦我在成人类别下创建了一个产品,系统就会列出儿童和成人的食物 该表目前的结构如下: 类别: 身份证件 顶部 名称 lft rgt 为了完整而创建 为完整起见,最后更新 因此,我能够从表中为每个物种构建一棵完整的树,但我需要的是,只有当它们为该物种提供了产品时,类别才可见 听起来很简单,但出于某种原因,我的大脑无法理解这一点。有什么帮助吗?最好的方法是什么 更新: 我用于获取类别的查询:Php 电子商务网站上的嵌套模型菜单,php,mysql,sql,menu,Php,Mysql,Sql,Menu,我有一个数据库,其中有一个类别表,使用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 )