gpt4 book ai didi

php - 如何通过选择顶级类别来检索属于子类别的项目?

转载 作者:行者123 更新时间:2023-11-29 02:35:21 25 4
gpt4 key购买 nike

请看下面的数据表和查询..

Items
Id, Name
1, Item 1
2, Item 2

Categories
Id, Name, Parent ID
1, Furniture , 0
2, Tables, 1
3, Beds, 1
4, Dining Table, 2
5, Bar Table, 2
4, Electronics, 0
5, Home, 4
6, Outdoors, 4
7, Table lamp, 4

ItemCategory
ItemId, CategoryId
1, 2 .. Row1
2, 4 .. Row 2
2, 5 .. Row 3

ItemCategory 表存储哪些项目属于哪个类别。一个项目可以属于顶级和/或子类别。大约有3级深分类,即Tob级、子级和子子级。

用户选择他们想要查看和提交的所有类别,我可以使用下面的示例查询来查询数据库。

    SELECT * FROM items i INNER JOIN ItemCategory ic ON 
ic.itemId = i.itemId AND ic.itemId IN ('comma separated category ids')

这很好用。

我的问题是是否可以查看顶级类别下的所有项目,即使它没有直接分配给该项目。例如,如果用户选择上面的家具,那么它会列出属于其子类别的所有项目(即使 ItemCategory 不包含它的任何记录)?

我愿意对数据表或查询进行必要的修改,请提出解决方案。谢谢。

最佳答案

Watcher 给出了一个很好的答案,但我会稍微改变一下我的方法,这样你就有了一个结构化的递归二维数组,其中类别作为键,项目作为值。这使得在响应用户的搜索要求时打印回给用户变得非常容易。

这是我测试过的方法:

$items = getItemsByCategory($topCategory);
//To print contents
print_r($items);

function getItemsByCategory($sid = 0) {
$list = array();
$sql = "SELECT Id, Name FROM Categories WHERE ParentId = $sid";
$rs = mysql_query($sql);
while ($obj = mysql_fetch_object($rs)) {
//echo $obj->id .", ".$parent." >> ".$obj->name."<br/>";
$list[$obj->name] = getItems($obj->id);
if (hasChildren($obj->id)) {
array_push($list[$obj->name],getItemsByCategory($obj->id));
}
}
return $list;
}

function getItems($cid) {
$list = array();
$sql = "SELECT i.Id, i.Name FROM Items p INNER JOIN ItemCategory ic ON i.id = ic.ItemId WHERE ic.CategoryId = $cid";
$rs = mysql_query($sql);
while ($obj = mysql_fetch_object($rs)) {
$list[] = array($obj->id, $obj->name);
}
return $list;
}

function hasChildren($pid) {
$sql = "SELECT * FROM Categories WHERE ParentId = $pid";
$rs = mysql_query($sql);
if (mysql_num_rows($rs) > 0) {
return true;
} else {
return false;
}
}

希望这对您有所帮助。

关于php - 如何通过选择顶级类别来检索属于子类别的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5980193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com