我有一张这样的表:
然后我想根据他们的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中进行,我不知道该怎么做。
答案 0 :(得分:1)
这是我能够带来的,似乎工作得很好。
PS-抱歉格式化,无法弄清楚:( (已修复?)
$testarray[$id] = $parent_id;
< / LI>
然后我通过下面的函数运行它,并按照我的需要命令它。
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中本地执行此操作。