2012-05-10 4 views
2

У меня есть таблицы БД category_path это в родительском ребенка отношения и его внешний вид, как этотвопрос MySql запросов в PHP

----------------------------- 
id | parent_id 
------------------------------ 
    1 | NULL   
    2 | 1   
    3 | 2   
    4 | 1   
    5 | 3   
    6 | 2   

с помощью этой таблицы я хочу, чтобы создать новую таблицу, в которой даст мне выход как это. В приведенной ниже таблице показано расстояние для каждого идентификатора от родителя 0 до этого идентификатора путем прохождения через его родителя.

---------------------------------- 
    # |id  | parent_id | distance  
---------------------------------- 
    1 | 1 | 1  | 0 
    2 | 1 | 2  | 1 
    3 | 1 | 3  | 2 
    4 | 1 | 4  | 1 
    5 | 1 | 5  | 3 
    6 | 1 | 6  | 2 
    7 | 2 | 2  | 0 
    8 | 2 | 3  | 1 
    9 | 2 | 5  | 2 
    10 | 2 | 6  | 1 
    11 | 3 | 3  | 0 
    12 | 3 | 5  | 1 
    13 | 4 | 4  | 0 
    14 | 5 | 5  | 0 
    15 | 6 | 6  | 0 

Как получить это либо по запросу базы данных, либо по кодированию?

+0

я хочу рекурсивный запрос для этого, но я знаю, что рекурсивный запрос не поддерживается MySql –

+0

Как вы обратите внимание, что MySQL не поддерживает рекурсивные функции так не подходит для этой модели списка смежности для хранения иерархических данных. Вы должны рассмотреть возможность реструктуризации своих данных для использования вложенных наборов или таблиц закрытия. См. [Этот ответ] (http://stackoverflow.com/a/192462/623041) для получения дополнительной информации. – eggyal

+0

выберите * из category_path я внутреннее соединение category_path с на c.id = i.id внутреннее соединение category_path c2 на c.parent_id = c2.id где c2.parent_id = @parentId –

ответ

1

Наконец Потратив весь вечер здесь ваше решение:

function findValue($key,$src){ 

    return $src[$key]; 
}  

function inPatentList($val, $patent_list){ 

    return (in_array($val, $patent_list)) ? true : false; 
} 

function findFullTraverse($id, $src,&$str){ 
    if(0 != ($value = findValue($id, $src))){ 
     if($str==''){ 
      $str .= $value; 
     }else{ 
      $str .= '_'.$value; 
     } 
     findFullTraverse($value,$src,$str); 
    } 
} 
$id_parent = array(
    '1' => '0', 
    '2' => '1', 
    '3' => '2', 
    '4' => '1', 
    '5' => '3', 
    '6' => '2', 
); 
$parent = array_values($id_parent); 
$ids = array_keys($id_parent); 

$depth = array(); 
$keys_for_value = array(); 
$id_parent = array_reverse($id_parent, true); 
foreach($id_parent as $key => $val){ 

    $depth[] = $key.'_'.$key.'_0'; 
    if(inPatentList($key, $parent)){ 
     $keys_for_value = array_keys($id_parent, $key); 
     $depth_found[$key] = $keys_for_value; 
     foreach ($depth_found[$key] as $value){ 
      $str = ''; 
      findFullTraverse($value, $id_parent,$str); 
      //echo $value.'=>'.$str.'<br/>'; 
      $traverse_array = explode('_', $str); 
      for($i=0;$i<sizeof($traverse_array);$i++){ 
       $has_depth = $i + 1; 
       $depth[]=$traverse_array[$i].'_'.$value.'_'.$has_depth; 
      } 
     } 
    } 
} 

sort($depth); 
echo '<pre>'; 
print_r($depth); 
echo '<pre>'; 

Надеется, что это должно работать !!!

+0

@ M.I.T Решает ли ваша проблема? Вы можете назвать это возвратом. Я использовал рекурсию здесь. Если вы не получите, дайте мне знать. Спасибо. –

+0

@@ Rajan Rawal ya его сделано tnx много брата. –

-1
SELECT `id`, `parent_id`, (`id` - `parent_id`) as `difference` 
    from `category_path`... 
+0

Извините, это неправильно , Это не так просто. – fancyPants