這個需求是在大鳥需要的拍賣網站會用到,其實一般搜尋引擎也常常會用類似這種「搜尋此分類下所有項目」的功能。
不過這篇不是講如何搜尋,而是要抓出分類之下的所有次分類,有了所有的分類之後,再下搜尋語法就沒什麼困難了。
我們先來定義一個簡單的分類結構範例:
女性用品 | ->保養品 | ->臉部 |
->身體 | ||
|
||
->背包 | ->水餃包 | |
->側揹包 | ||
->方包 |
資料庫規畫上,每個分類只要記住自己屬於誰之下(也就是上一層的分類) 就可以了。
範例:
資料庫:CATA
欄位1 :NAME (分類名稱)
欄位2 :PARENT (上層分類名稱)
再來我們的目的主要是列出某個分類之下所有的分類清單,像是我要抓出「背包」之下的所有分類,只要執行 getSubs(“背包”),即可回傳 “水餃包”,”側揹包”,”方包”
(以下語法範例為 php + adodb 遞迴)
function getSubs($n) { global $conn, $subs; sql = "SELECT NAME FROM CATA WHERE PARENT=".$n ; $rs = &$conn->Execute($sql); $subs.= $n.", "; while ($rs && !$rs->EOF) { $nextname = $rs->fields["NAME"]; getSubs($i); //開始遞迴: $rs->MoveNext(); } }
這樣就完成這個功能了。
使用遞迴雖然很方便,但要注意遞迴的原罪,在層數太多時,系統 Loading 會加重,而且在伺服器記憶體不夠的狀況下,非常容易產生 Stack Overflow ,造成整台伺服器突然就當在那邊了。
如果需要的層數很多、伺服器記憶體又小的話,在下一篇我將介紹另一種方法來達到同樣的功能,而且一點都不複雜喔!
3 comments On 資料庫表單的多層分類搜尋 – 遞迴篇
題外話~
無意間發現的拍賣網
http://www.bidplus.com.tw
這也是老牌子囉,不過他們的走向是比較屬於名牌精品的,而且畫面也實在很難看,亂七八糟的。
分段标志的设计方法是个不错的选择。
如:
->背包(001) ->水餃包 (001001)
->側揹包 (001002)
->方包 (001003)