Цитата (Kusss @ 26.03.2019 - 22:46) |
А от чего пляшем то. Нужно получить всех предшественников или потомков ? |
BEGIN
DECLARE i INT DEFAULT 1000000;
IF (id>0) THEN
wet : WHILE i>0 DO
IF(@to_id = 0)
THEN
SET @to_id = NULL;
RETURN @id;
LEAVE wet;
ELSE
SELECT id, to_id
FROM table
WHERE id = id
INTO @id,@to_id;
SET id = @to_id;
END IF;
SET i=i-1;
END WHILE wet;
END IF;
END
Цитата (Zzepish @ 26.03.2019 - 23:26) |
Обычно такое не педалят на огромных таблицах (ибо тупо стремно). |
BEGIN
DECLARE i INT DEFAULT 1000000;
IF (id>0) THEN
wet : WHILE i>0 DO
IF(@to_id = 0)
THEN
SELECT id,to_id
FROM test
WHERE to_id NOT IN (@id)
LEAVE wet;
ELSE
SELECT @id := id, @to_id := to_id
FROM table
WHERE id = id;
END IF;
SET id = @to_id;
SET i=i-1;
END WHILE wet;
ELSE
SELECT 'Задайте правильный id';
END IF;
END
Цитата (Эли4ка @ 27.03.2019 - 00:46) |
То есть в поле to_id содержиться указатель на id. Эдакая рекурсия. |
SELECT p.*
FROM products AS p
INNER JOIN products_tree AS t ON p.id=t.ancestor_id
WHERE t.descendant_id='$id'
Цитата (kaww @ 27.03.2019 - 03:33) |
Эдакое дерево. А для работы с деревьями в реляционных БД придумано много способов: Adjacency List, Nested Sets, Materialized Path, Closure Table и, наверняка, есть что-то еще. Например, возьмем Closure Table, по причине, что основные операции с деревьями в нем делаются достаточно просто. К тому же данные самого дерева хранятся в отдельной таблице, а это значит, что его поддержку можно реализовать на триггерах, и таким образом не придется думать об этом на стороне php и в случае ТС не придется менять уже существующую таблицу. Тогда чтобы вывести всех потомков, достаточно выполнить запрос вида |
Цитата (Эли4ка @ 27.03.2019 - 13:01) |
Но запрос что-то ваш не работает как надо |
Цитата |
Вот хотелось бы обоснование. |
Цитата |
Смотря как педалить smile.gif Можно такой велосипед собрать, что и педали будут быстро крутиться, а вот прикладывать на php рекурсивные вещи которые завязаны на бд, я бы не советовал никогда |
$categories = [];и результат
$sql = "
SELECT
*
FROM
`test`
ORDER BY
`to_id`,
`id`
";
$result = $mysqli->query($sql);
while ($value = $result->fetch_assoc()) {
$categories[ $value['id'] ] = $value;
}
echo '<pre>';
$id = 7;
print_r( breadcrumb($id, $categories) );
$id = 6;
print_r( breadcrumb($id, $categories) );
echo '</pre>';
// Получаем массив для хлебных крошек
function breadcrumb($id, $categories = []){
if (count($categories) == 0)
return false;
$brc = [];
//Перебираем полученый массив с меню
for($i = 0; $i < count($categories); $i++){
//Проверяем что мы не нашли родителя и не массив пуст
if($id != 0 and !empty($categories[$id])){
//Ищим родителя
$brc[ $categories[$id]['id'] ] = $categories[$id]['name'];
$id = $categories[$id]['to_id'];
}
//Останавливаем цикл
else
break;
}
//Возвращаем перевернутый массив с сохранением ключей
return array_reverse($brc, true);
}
Array
(
[1] => Дерево
[4] => Бумага
[7] => Книга
)
Array
(
[2] => Руда
[5] => Железо
[6] => Сталь
)