2011-09-23 31 views
0

我已經從SO中得到了各種解決方案來創建我的第一個MLM項目,但現在我陷入了總體下行計數(通過遞歸函數),因爲我沒有在此之前的想法,請任何人幫助我。如何爲mlm項目創建適當的遞歸函數

我的數據庫表結構如下(表名構件):

`member_id | member_name | node_left | node_right

其中成員的關係爲:

  member_id (Id 101) 
       /\ 
      /\ 
node_left(Id 102) node_right(Id 103) 
       /\     /\ 
      /\   blank/\blank 
(again) blank node_right (104) 

......等等。以上只是一個例子

`

現在我需要計算任何成員的總下線。例如:假設上面的例子,我想知道總下線member_id 101 如何創建遞歸函數來做到這一點,以有限循環結束?

請給我任何想法..

+0

所示的表結構(基本上,它是一個鄰接表設計)不適合用於處理SQL中的分層數據。參見[「在關係數據庫中存儲分層數據的選項?」](http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a - 關係數據庫)以獲得更好的選擇。 – outis

+0

@outis:它似乎是一個嵌套集合設計,而不是一個鄰接列表。 – Rijk

+0

@Rijk:每個節點都將邊緣存儲到它的兩個子元素(與用於鄰接的標準模式相反,但是相鄰),而不是子樹的邊界。注意你有'(101,'...',102,103)'; 104不在範圍內,雖然它是後代。 – outis

回答

1

我不知道如果你已經嘗試實現這裏nested set model,但實現不看的權利..

隨着一組嵌套,代表你的樹結構中的左/右值應該是這樣的:

member 101 (root): left=1, right=8 
member 102: left=2, right=5 
member 103: left=3, right=4 
member 104: left=6, right=7 

然後,計算的成員#101孩子的將是簡單:

SELECT COUNT(*) FROM member WHERE node_left > 1 AND node_right < 8 
0

您可以使用/創建您自己的自定義功能從下面的代碼,只需檢查出來,並嘗試實施您的情況。

function Recursive_getsubcategory($parent_id,$cat_group,$intLevel) 

{ 
     global $intLevel; 


    $sql = "select *,".$intLevel." as level from tbl_name where parent_id = '".$parent_id."' "; 

    $result = mysql_query($sql); 
    $cat_name = $result->fetch_array_multiple(); 

    if(count($cat_name) > 0) 
    { 
     for($k=0;$k<count($cat_name);$k++) 
     { 
      $cat_group[] = array('id'=>$cat_name[$k]['sub_id'], 
             'parent_id'=>$cat_name[$k]['parent_id'], 
             'level' => $cat_name[$k]['level'] 

             ); 

$parent_id[] = $cat_name[$k]['parent_id'];    

//Function For Recursive Get Sub Category... 
Recursive_getsubcategory($cat_name[$k]['ebay_sub_id'],$cat_group,$intLevel++); 
     } 

    } 
    // count of total downline nodes 
return count($cat_group); 

}

此代碼爲您的任務可能會有所幫助。

+0

mysql擴展正在棄用,不應該用於新代碼。不要直接在變量中插入變量,應該使用預先準備好的語句,因爲重複查詢時它們更安全快速。不要使用['SELECT *'](http://stackoverflow.com/questions/321299/what-is-the-reason-not-to-use-select);只選擇你需要的列。 – outis

+0

代碼中的[indentation](http://en.wikipedia.org/wiki/Indent_style)是不可讀的。不應該聲明'$ intLevel'是全局的;它只應該作爲參數傳遞。沒有必要在'SELECT'中添加'$ intLevel'。 'mysql_query'返回一個資源,而不是一個對象,並且沒有'fetch_array_multiple'方法。在循環內增加'$ intLevel'意味着後續的兄弟將以連續較低的級別被記錄。 – outis

+0

在某一點上,您將'$ parent_id'視爲標量;在另一個陣列上。循環的主體執行一些不必要的任務:不需要記錄每個父ID,尤其是在函數調用中它們都是相同的;因爲您只需要大小,所以不需要在'$ cat_group'中記錄每個項目。 – outis