【问题标题】:MySQL Nested Sets SearchingMySQL 嵌套集搜索
【发布时间】:2011-09-14 19:53:48
【问题描述】:

在我们的 PHP/MySQL 驱动商店中,我真的很难处理嵌套集合查询,我将使用电子零件作为示例。

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

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

假设客户正在查看 Sony 的所有产品。索尼将拥有计算机、电视、音频和家用电器产品。

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

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,如果这样可以简化任何事情。

谢谢。

【问题讨论】:

  • 我已经设法让它工作了,但它很慢!!关于索引或更改其工作方式的任何想法?
  • SELECT cd.*,ancestor.* FROM fec_categories child JOIN fec_categories 祖先 ON child.lft BETWEEN 祖先.lft AND 祖先.rgt JOIN fec_categories_description cd ON祖先。categories_id = cd.categories_id 在 child.categories_id = p2c.categories_id 上加入 fec_products_to_categories p2c 在 p.products_id = p2c.products_id 上加入 fec_products p 其中 p.manufacturers_id = 6 AND child.@98765435@ = 1 AND祖先.categories_status = 1 AND cd.language_id = 1 AND 祖先.dpth = 1 按祖先分组.categories_id按祖先排序.lft
  • 我最终放弃了,转而使用 Bill Karwin 的传递闭包表方法,这更符合我们的要求。

标签: mysql nested-sets


【解决方案1】:

根据您的评论,您尝试了其他方法,但我想我还是会回答。

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

我过去通过以下两种方式克服了这个问题管理员可以在插入发生后自行订购。

我个人喜欢选项 2,并且从未发现它有问题。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2020-06-15
    • 2016-10-09
    • 1970-01-01
    • 2020-09-06
    • 2012-02-01
    相关资源
    最近更新 更多