我真的在PHP / MySQL驱动的商店中使用嵌套集查询,我将使用电子部件作为示例。
类别存储为嵌套集模型(左,右和深度)。
当客户浏览商店时,他们可以按品牌,类别,价格范围等过滤产品列表。
让我们说客户正在查看索尼的所有产品。索尼将拥有计算机,电视,音频和Hosuehold设备产品。
但索尼产品并未存储在这些类别中(但它们可能存在),它们存储在这些主要类别的子类别中,例如:
Televisions > LCD > Widescreen
Televisions > CRT
Computing > Optical Drives > DVD-RW
Computing > Input Devices > Wireless > Keyboards
Audio > Portable > MP3
Household Appliances
客户选择索尼后,我希望他们可以选择按类别缩小范围,因此他们最初会选择这些:
Televisions
Computing
Audio
Household Appliances
但我只能做一个带回特定类别列表的查询:
Widescreen
CRT
DVD-RW
Keyboards
MP3
Household Appliances
我需要显示主要类别,然后如果客户选择电视,他们会得到选择:
LCD
CRT
任何人都可以帮助我,最好尽可能快地返回信息,最小的递归(因此首先使用嵌套集)或者查询太多,我将非常感激。
这是我用来获取子类别列表的查询,如果它有助于数据库的结构:
select c.categories_id, cd.categories_name, c.parent_id, c.lft, c.rgt, c.dpth
from categories c
inner join categories_description cd on cd.categories_id = c.categories_id
inner join products_to_categories p2c on p2c.categories_id = c.categories_id
inner join products p on p.products_id = p2c.products_id
where cd.language_id='1'
and c.lft between 3489 and 3670
and c.categories_status = '1'
group by c.categories_id
order by sort_order, cd.categories_name
由于数据库最初是一个邻接模型结构,因此每个类别id也会存储父ID,如果这样可以简化任何内容。
感谢。
答案 0 :(得分:0)
从你的评论中你已经尝试了别的东西,但我想我还是会回答。
正如您所发现的那样,nested set
模型在快速有效地检索节点和叶子方面非常出色。但是,一个gotchya
是您发现在插入后很难对列表进行排序。
我在过去通过以下方式克服了这个问题:a)在客户端订购(困难)然后缓存或b)确保我插入节点/叶子以便自动订购(甚至使用向上/向下链接以便管理员可以在插入发生后自行订购。
我个人喜欢选项2,但从未发现它是一个问题。