【发布时间】: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_categorieschild JOINfec_categories祖先 ON child.lftBETWEEN 祖先.lftAND 祖先.rgtJOINfec_categories_descriptioncd 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