У меня есть таблица вроде этого:
Затем я хочу выбрать определенные строки на основе их 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, и я тоже не знаю, как это сделать.
Вот что я смог придумать, с которым, кажется, отлично работает.
PS-Извините за форматирование, не могу понять 🙁 (исправлено?)
$testarray[$id] = $parent_id;
Затем я запускаю его через перечисленные ниже функции, и он заказывает его, как мне это нужно.
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));
с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));
Без изменения структуры таблицы это требует рекурсии, которую MySQL не поддерживает. Вам придется сделать это в другом месте. Вы можете написать рекурсивную функцию в PHP, чтобы использовать, например, поиск в ширину для создания вашего массива. Здесь, похоже, вы используете parent_id
из 0 для обозначения объекта верхнего уровня. Вы можете выполнять поиск по вашим результатам и добавлять в свой массив каждый объект, родитель которого равен нулю, который даст вам массив с 1 и 8. Затем вы можете рекурсивно: найти все результаты с родителем 1 и добавить это как подмассив к 1; затем найдите все результаты с родителем 8 и добавьте их в качестве подмассива 8. Продолжайте делать это для каждого уровня, пока не закончите результаты.
Как отмечали другие плакаты, вы можете сделать это изначально в MySQL, если можете изменить структуру таблицы.