父子关系PHP / MYSQL

时间:2011-05-05 23:31:49

标签: php mysql sql hierarchical-data

我有一张这样的表:

  • id
  • 姓名
  • parent_id

然后我想根据他们的id选择某些行,所以像这样:

SELECT * 
  FROM TABLE 
 WHERE id IN ('1', '5', '8', '9', '35')  

我希望从此查询中还显示父/子关系,例如:

id   parent  
-----------
1    0  
5    1  
8    0  
9    8  
35   9  

所以最终输出看起来像这样:

1  
--5  

8   
--9  
 ----35  

我是否在mysql之外执行此操作,我已尝试使用数组,但无法弄清楚,或者 我是否在MYSQL中进行,我不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

这是我能够带来的,似乎工作得很好。

PS-抱歉格式化,无法弄清楚:( (已修复?)

  1. 我从MYSQL中获取了我的parent_id和id并将其放入arraly,其中数组键是id,值是父类,因此在mysql的while循环中,这样的内容如下:$testarray[$id] = $parent_id; < / LI>
  2. 然后我通过下面的函数运行它,并按照我的需要命令它。

    function retrieveSubTree($parent, $myarray) {
        $tempArray = $myarray;
        $array = array();           
        //now we have our top level parent, lets put its children into an array, yea!
        while ($child = array_search($parent, $tempArray)) {
            unset($tempArray[$child]);
            //now lets get all this guys children
            if (in_array($child, $tempArray)) {
                $array[$child] = retrieveSubTree($child, $tempArray);
            } else {
                $array[$child] = true;
            }
        }//end while
        return (!empty($array)) ? $array : false;
    }
    
    function retrieveTree($myarray) {
        $array = array();
        $counter = 0;
        foreach ($myarray as $key => $value) {
            $child = $key;
            $parent = $value;
            //if this child is a parent of somebody else
            if (in_array($child, $myarray) && $parent != '0') {
                while ($myarray[$parent] != '' && $myarray[$parent] != '0') {
                    $newparent = $myarray[$parent];
                    $parent = $newparent;
                }
                if (!array_key_exists($parent, $array)) {
                    $array[$parent] = retrieveSubTree($parent, $myarray);
                }
            } else {
                //now make sure they don't appear as some child
                if (!array_key_exists($parent, $myarray)) {
                    //see if it is a parent of anybody
                    if (in_array($child, $myarray)) {
                        $array[$child] = retrieveSubTree($child, $myarray);
                    } else {
                        $array[$child] = true;
                    }
                }//end if array key
            }//end initial in array
        }//end foreach
        return (!empty($array) ? $array : false);
    } 
    
    $test = array(
        '1'=>'15',
        '2'=>'1',
        '3'=>'1',
        '4'=>'0',
        '5'=>'0',
        '6'=>'4',
        '7'=>'6',
        '8'=>'7',
        '9'=>'2',
        '10'=>'9'
    );
    
    print_r(retrieveTree($test)); 
    

答案 1 :(得分:0)

在不更改表结构的情况下,这需要递归,MySQL不支持。你必须在其他地方这样做。您可以在PHP中编写递归函数,例如使用breadth-first search来构建数组。在这里,您似乎使用0的parent_id来表示顶级对象。您可以搜索结果,并将每个父项为零的对象添加到数组中,这将为您提供一个包含1和8的数组。然后您可以递归:查找父项为1的所有结果,并将其添加为子阵列为1;然后找到父母为8的所有结果,并将其作为8的子数组添加。继续为每个级别执行此操作,直到结果用完为止。

正如其他海报所指出的那样,如果你可以改变表结构,你可以在MySQL中本地执行此操作。