MySQL嵌套集搜索

时间:2011-06-14 15:38:07

标签: mysql nested-sets

我真的在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,如果这样可以简化任何内容。

感谢。

1 个答案:

答案 0 :(得分:0)

从你的评论中你已经尝试了别的东西,但我想我还是会回答。

正如您所发现的那样,nested set模型在快速有效地检索节点和叶子方面非常出色。但是,一个gotchya是您发现在插入后很难对列表进行排序。

我在过去通过以下方式克服了这个问题:a)在客户端订购(困难)然后缓存或b)确保我插入节点/叶子以便自动订购(甚至使用向上/向下链接以便管理员可以在插入发生后自行订购。

我个人喜欢选项2,但从未发现它是一个问题。