SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.05.2010 22:03:38

owlpic
Участник
Зарегистрирован: 19.05.2010
Сообщений: 7

Родственные связи в одной таблице

Здравствуйте! Ситуация следующая:

Имеется таблица, в ней, допустим, три столбца. ID, Имя и ID родителя данной записи в этой же таблице.

Как выбрать предков одного элемента? То есть родителя строки, родителя родителя строки и так далее, пока выборка не закончится главным родителем (корневым).

Можно конечно в том же PHP сделать цикл, но почему-то у меня есть надежда, что это делается одним запросом...

Или может имеется более рациональный (или более реалистичный) способ сделать подобную выборку?

Неактивен

 

#2 19.05.2010 22:33:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Родственные связи в одной таблице

http://webew.ru/articles/2080.webew
Во второй части статьи реализация средствами MySQL.

Неактивен

 

#3 19.05.2010 23:50:48

owlpic
Участник
Зарегистрирован: 19.05.2010
Сообщений: 7

Re: Родственные связи в одной таблице

Спасибо за информацию! Но не совсем то... В примере обработка в PHP идет, как я и представлял, процедура на SQL просто как пример. Я надеялся на какой-нибудь ухищренный запрос один smile Дело в том, что таблица большая и обрабатывать полную выборку вообще не вариант. Нужно брать один элемент и именно по этому элементу искать родителей. Как понимаю единственный вариант примерно таков:

<?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)

Неактивен

 

#4 20.05.2010 10:16:12

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Родственные связи в одной таблице

Одним запросом можно, если есть хорошая денормализация.
Хорошая денормализация — это или таблица «все родители» (содержит id и id родителя,
id и id деда и т.д. до корня). Ее легко поддерживать актуальной и с ней легко делать вы-
борку.

Вторая хорошая денормализация — поддерживать у каждого элемента«левое» и «правое»
поля. Второе надо, наверное, пояснить.

id | left | right | parent
5     1      10        0
15   11     20        0
7      1      9         5

Смысл такой — каждый родитель выделяет себе поддиапазон id для своих детей.
Каждый ребенок — поддиапазон для своих, и т.д. Тогда выборка получается по
одной таблице (просто ищете тех, у кого left <= id <= right). Минус в том, что
поддерживать эту схему чуть сложнее.

Неактивен

 

#5 20.05.2010 14:30:31

owlpic
Участник
Зарегистрирован: 19.05.2010
Сообщений: 7

Re: Родственные связи в одной таблице

Вот то что я искал! Спасибище огромнейшее! Первый способ подходит, второй - нет, так как родственники разбросаны по таблице и строгого диапазона "от" и "до" нет. Только еще добавить колонку с уровнем наследования (родитель - 1, дед - 2 и т.д.) и будет то что надо.

Замечательный форум у вас smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson