2011-06-14 143 views
0

我在我們PHP/MySQL驅動的商店中非常努力地使用嵌套集查詢,我將以電子部分爲例。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 

但我只能這樣做帶回具體的類別列表查詢:

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 

隨着數據庫原本是adjacancy模型結構,每個類別ID也有父如果簡化了任何內容,也會存儲ID。

謝謝。

+0

我都有種設法得到它的工作,但它是非常緩慢!!任何想法索引或改變它的工作方式? – Paul 2011-06-15 14:14:52

+0

選擇\t \t cd。*,祖先。* FROM \t \t'fec_categories'孩子 JOIN \t \t'fec_categories'祖先打開之間ancestor.'lft' child.'lft'和ancestor.'rgt' JOIN \t \t'fec_categories_description' CD上ancestor.'categories_id' = cd.'categories_id' JOIN上child.categories_id = p2c.categories_id \t \t fec_products_to_categories P2C JOIN \t \t fec_products上p.products_id = p2c.products_id WHERE \t \t p.'manufacturers_id' = 6 AND \t \t子頁。 '美食gories_status' = 1 AND \t \t ancestor.'categories_status' = 1 AND \t \t cd.'language_id' = 1 AND ancestor.'dpth' = 1 GROUP BY ancestor.'categories_id' ORDER BY \t ancestor.' lft' – Paul 2011-06-15 14:15:51

+0

我最終放棄了這一點,轉而採用Bill Karwin的傳遞閉包表法,這更適合我們的要求。 – Paul 2011-06-30 10:25:15

回答

0

從您的評論中,你嘗試了別的,但我想我會回答。

正如您發現nested set模型在檢索節點和樹葉快速而高效地出色。但是一個gotchya是您發現在插入後很難排列列表。

我已經通過a)在客戶端排序(困難)然後緩存或b)確保我插入節點/葉,以便自動排序(或者甚至使用向上/向下鏈接因此管理員可以訂購自己在插入完成之後發生。

我個人喜歡選擇2,從來沒有發現這是一個問題。