我有一个数据库,其中有一个类别表,使用MySql中的嵌套方法。但我总是碰壁。该网站包含“部分”物种(因为这是一个宠物店)。我已经有了一个查询,它返回每个物种的所有类别中都有产品。
现在我的问题是,我想只能显示类别下有产品。例如,如果我用一个子类创建类别food
。那么系统不应该在任何物种下列出类别。但只要我在adult
类别下创建一个产品,系统就应该列出adult
和子Food
的列表。
该表目前的结构如下:
类别:
身份证件
顶部
名称
线性调频
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)");
或者
$q = mysql_query("SELECT a.* FROM Categories a WHERE (SELECT count(*) FROM Products WHERE categoryID = a.id) >= 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>';
您可以接受这一点,并适应您的代码,或者如果您对您的数据库结构有更多的解释,我可以进一步帮助。