MySQL嵌套集搜索
在我们的PHP/MySQL驱动的商店中,我真的很难处理嵌套的集合查询,我将以电子部件为例 类别存储为嵌套集模型(左、右和深度) 当客户浏览商店时,他们可以按品牌、类别、价格范围等筛选产品列表 假设一个客户正在观看索尼的所有产品。索尼将在电脑、电视、音频和家用电器领域拥有产品 但索尼的产品并不是存储在这些类别中(但它们可能是),而是存储在这些主要类别的子类别中,例如:MySQL嵌套集搜索,mysql,nested-sets,Mysql,Nested Sets,在我们的PHP/MySQL驱动的商店中,我真的很难处理嵌套的集合查询,我将以电子部件为例 类别存储为嵌套集模型(左、右和深度) 当客户浏览商店时,他们可以按品牌、类别、价格范围等筛选产品列表 假设一个客户正在观看索尼的所有产品。索尼将在电脑、电视、音频和家用电器领域拥有产品 但索尼的产品并不是存储在这些类别中(但它们可能是),而是存储在这些主要类别的子类别中,例如: Televisions > LCD > Widescreen Televisions > CRT Computi
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
LCD
CRT
但我只能执行一个查询,返回特定类别的列表:
Widescreen
CRT
DVD-RW
Keyboards
MP3
Household Appliances
我需要显示主要类别,然后如果客户选择电视,他们将得到以下选择:
Televisions
Computing
Audio
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(如果这简化了任何事情的话)
谢谢。从你的评论中,你尝试了其他方法,但我想我还是会回答的 正如您所发现的,
嵌套集
模型在快速高效地检索节点和叶子方面非常出色。然而,有一个问题是,您发现在插入后很难对列表进行排序
我过去已经克服了这一点:a)在客户端排序(困难),然后缓存;b)确保插入节点/叶以便自动排序(甚至使用上/下链接,以便管理员可以在插入后自行排序
我个人喜欢选项2,从来没有发现它是一个问题。我已经设法让它工作了,但它非常慢!!关于索引或改变它工作方式的任何想法?从
fec_类别
child JOINfec_类别
子代上的祖先。lft
在祖先之间。lft代码>和祖先。rgt
加入fec\u类别\u描述
cd关于祖先。categories\u id
=cd。categories\u id
加入fec\u产品到子产品上的p2c类别。categories\u id=p2c。categories\u id加入p.products\u id=p2c.products\u id,其中p.manufacturers\u id
=6和child。categories\u status
=1和祖先。categories\u status
=1和cd。language\u id
=1和祖先。dpth
=1组按祖先。categories\u id
按祖先排序。lft
我最终放弃了这一点,转而使用Bill Karwin的可传递闭包表方法,这非常有用它适合我们的要求。