Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте! Ситуация следующая:
Имеется таблица, в ней, допустим, три столбца. ID, Имя и ID родителя данной записи в этой же таблице.
Как выбрать предков одного элемента? То есть родителя строки, родителя родителя строки и так далее, пока выборка не закончится главным родителем (корневым).
Можно конечно в том же PHP сделать цикл, но почему-то у меня есть надежда, что это делается одним запросом...
Или может имеется более рациональный (или более реалистичный) способ сделать подобную выборку?
Неактивен
http://webew.ru/articles/2080.webew
Во второй части статьи реализация средствами MySQL.
Неактивен
Спасибо за информацию! Но не совсем то... В примере обработка в PHP идет, как я и представлял, процедура на SQL просто как пример. Я надеялся на какой-нибудь ухищренный запрос один Дело в том, что таблица большая и обрабатывать полную выборку вообще не вариант. Нужно брать один элемент и именно по этому элементу искать родителей. Как понимаю единственный вариант примерно таков:
<?php
$query = "SELECT parentID FROM a WHERE ID=$id";
$result = mysql_query($query);
$row = mysql_fetch($result);
$arr = array();
while($row['parentID']!=0) {
$query = "SELECT ID, name, parentID FROM a WHERE ID=".$row['parentID'];
$result = mysql_query($query);
$row = mysql_fetch($result);
$arr[] = $row;
}
?>
Или может как то более оптимально можно?
Отредактированно owlpic (20.05.2010 00:06:35)
Неактивен
Одним запросом можно, если есть хорошая денормализация.
Хорошая денормализация — это или таблица «все родители» (содержит id и id родителя,
id и id деда и т.д. до корня). Ее легко поддерживать актуальной и с ней легко делать вы-
борку.
Вторая хорошая денормализация — поддерживать у каждого элемента«левое» и «правое»
поля. Второе надо, наверное, пояснить.
id | left | right | parent
5 1 10 0
15 11 20 0
7 1 9 5
Смысл такой — каждый родитель выделяет себе поддиапазон id для своих детей.
Каждый ребенок — поддиапазон для своих, и т.д. Тогда выборка получается по
одной таблице (просто ищете тех, у кого left <= id <= right). Минус в том, что
поддерживать эту схему чуть сложнее.
Неактивен
Вот то что я искал! Спасибище огромнейшее! Первый способ подходит, второй - нет, так как родственники разбросаны по таблице и строгого диапазона "от" и "до" нет. Только еще добавить колонку с уровнем наследования (родитель - 1, дед - 2 и т.д.) и будет то что надо.
Замечательный форум у вас
Неактивен