Neo 's Blog

Neo 's Blog

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

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


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

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

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

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

範例:
資料庫:CATA
欄位1 :NAME (分類名稱)
欄位2 :P ARENT (上層分類名稱)

再來我們的目的主要是列出某個分類之下所有的分類清單,像是我要抓出「背包」之下的所有分類,只要執行 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 Responses so far.

  1. v v 說道:

    題外話~
    無意間發現的拍賣網
    http://www.bidplus.com.tw

  2. Neo 說道:

    這也是老牌子囉,不過他們的走向是比較屬於名牌精品的,而且畫面也實在很難看,亂七八糟的。

  3. RedFox 說道:

    分段标志的设计方法是个不错的选择。

    如:
    ->背包(001) ->水餃包 (001001)
    ->側揹包 (001002)
    ->方包 (001003)


搜尋

分類

歷史文章

贊助