我有一个使用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查询!
- 一个是物种列表。
- 一个用于所有的类别里面的产品。
- 我循环查找一个的所有类别的一个
迎接下一个挑战!