資料庫表單的多層分類搜尋 – 遞迴篇

這個需求是在大鳥需要的拍賣網站會用到,其實一般搜尋引擎也常常會用類似這種「搜尋此分類下所有項目」的功能。


不過這篇不是講如何搜尋,而是要抓出分類之下的所有次分類,有了所有的分類之後,再下搜尋語法就沒什麼困難了。

我們先來定義一個簡單的分類結構範例:

女性用品 ->保養品 ->臉部
    ->身體
 
  ->背包 ->水餃包
    ->側揹包
    ->方包

資料庫規畫上,每個分類只要記住自己屬於誰之下(也就是上一層的分類) 就可以了。

範例:
資料庫: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 資料庫表單的多層分類搜尋 – 遞迴篇

Leave a reply:

Your email address will not be published.

Site Footer

Sliding Sidebar