2012-06-18 58 views
0

我有一個查詢(+ php)獲取父母的所有孩子,但現在翻轉它,所以我得到一個元素的所有父母會更有用。我如何獲得元素的所有父母?

表:

ID  parentID  showOrder 
=============================== 
1  0   0 
2  1   0 
3  2   0 
4  3   1 
5  3   2 
6  3   3 

代碼:

<?php 
$structure = array(); 
$sql = "SELECT ID, parentID FROM table ORDER BY parentID ASC, showOrder ASC"; 
while ($row = fetch_row()) { 
    $structure[$row['parentID']][] = $row['ID']; 
} 

輸出:

0: [1], 1: [2], 2: [3], 3: [5,4,6] 

優選結果:

0: [], 1: [0], 2: [1, 0], 3: [2, 1, 0], 
4: [3, 2, 1, 0], 5: [3, 2, 1, 0], 6: [3, 2, 1, 0] 

我該怎麼做?

+0

你的意思是祖先,不只是父母我承擔? –

回答

0

您正在落在分層查詢域中。

雖然Oracle提供了一個非常方便的方法來繼續(CONNECT BY子句),但mysql並沒有。

以下鏈接http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/將解釋如何通過純粹的mysql達到您的目標。

如果你只想通過php來做到這一點,你也可以,但它會導致效率低下,因爲引擎切換(php/mysql之間的通信:調用查詢,返回到php等)可能會變成代價很高,經過多次迭代。

rgds。

0

如果父母總是爲了,你可以保持祖先的陣列,像這樣:

// initialize as empty 
$ancestors = array(); 
while ($row = fetch_row()) { 
    $ancestors[$row['id']] = array($row['parentid'] => $row['parentid']); 
    // if the parent exists 
    if (isset($ancestors[$row['parentid']])) { 
     // grow ancestors by parent's ancestors 
     $ancestors[$row['id']] += $ancestors[$row['parentid']]; 
    } 
} 

輸出:

Array 
(
    [1] => Array 
     (
      [0] => 0 
     ) 

    [2] => Array 
     (
      [1] => 1 
      [0] => 0 
     ) 

    [3] => Array 
     (
      [2] => 2 
      [1] => 1 
      [0] => 0 
     ) 

    [4] => Array 
     (
      [3] => 3 
      [2] => 2 
      [1] => 1 
      [0] => 0 
     ) 

    [5] => Array 
     (
      [3] => 3 
      [2] => 2 
      [1] => 1 
      [0] => 0 
     ) 

    [6] => Array 
     (
      [3] => 3 
      [2] => 2 
      [1] => 1 
      [0] => 0 
     ) 

)