Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL嵌套集搜索_Mysql_Nested Sets - Fatal编程技术网

MySQL嵌套集搜索

MySQL嵌套集搜索,mysql,nested-sets,Mysql,Nested Sets,在我们的PHP/MySQL驱动的商店中,我真的很难处理嵌套的集合查询,我将以电子部件为例 类别存储为嵌套集模型(左、右和深度) 当客户浏览商店时,他们可以按品牌、类别、价格范围等筛选产品列表 假设一个客户正在观看索尼的所有产品。索尼将在电脑、电视、音频和家用电器领域拥有产品 但索尼的产品并不是存储在这些类别中(但它们可能是),而是存储在这些主要类别的子类别中,例如: Televisions > LCD > Widescreen Televisions > CRT Computi

在我们的PHP/MySQL驱动的商店中,我真的很难处理嵌套的集合查询,我将以电子部件为例

类别存储为嵌套集模型(左、右和深度)

当客户浏览商店时,他们可以按品牌、类别、价格范围等筛选产品列表

假设一个客户正在观看索尼的所有产品。索尼将在电脑、电视、音频和家用电器领域拥有产品

但索尼的产品并不是存储在这些类别中(但它们可能是),而是存储在这些主要类别的子类别中,例如:

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 JOIN
fec_类别
子代上的祖先。
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的可传递闭包表方法,这非常有用它适合我们的要求。