[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: while в postgresql
olgatcpip
Здравствуйте,

Есть таблица
id | parent_id | time
--------------------------
1 | 0 | 01.06.2009
2 | 1 | 10.06.2009
3 | 2 | 20.06.2009
4 | 3 | 30.06.2009


где, id - PK, parent_id - это родитель, ешьу - это время создания

Видно. что у ид=3, родитель 2 (time = 10.06.2009 ) и так сказать прародитель я вляется ид=1.
И будем считать, что у ид=4, прародитель 1.

Необходимо создать функцию, которая бы находила прародителя.

К сожалению, я не знаю как строится цикл while. Подскажите синтаксис.



Спустя 10 минут, 59 секунд (28.07.2009 - 08:03) sergeiss написал(а):
Ну, вообще-то, синтаксис такой...
Код
38.6.3.4. WHILE
[ <<label>> ]
WHILE boolean-expression LOOP
   statements
END LOOP [ label ];
The WHILE statement repeats a sequence of statements so long as the boolean-expression evaluates to true. The expression is checked just before each entry to the loop body.

For example:

WHILE amount_owed > 0 AND gift_certificate_balance > 0 LOOP
   -- some computations here
END LOOP;

WHILE NOT done LOOP
   -- some computations here
END LOOP;


А что, хэлпа нету, что ли? blink.gif blink.gif blink.gif


И еще. Зачем тут цикл, я не понял?


PS. Вот тут можно скачать и хорошую систему управления базой данных, и там же есть очень качественный хэлп.

Спустя 18 минут, 34 секунды (28.07.2009 - 08:22) olgatcpip написал(а):
Цитата
Зачем тут цикл, я не понял?

затем, что другого решения не вижу. Слышала, что можно рекурсивные запросы писать, но даже не представляю как он должен выглядеть. подскажите? huh.gif


Цитата
А что, хэлпа нету, что ли?
есть, но я там в указатель вводила while, а он мне не ответил ничего разумительного sad.gif

Спустя 27 минут, 7 секунд (28.07.2009 - 08:49) sergeiss написал(а):
Насчет рекурсии и вообще алгоритма...

Какой вообще используется критерий того, что найден самый главный прародитель?

В целом "просится" такой алгоритм: в функции находим "родителя" объекта, переданного в качестве параметра. Если он не является "прародителем" самого высокого уровня (по неизвестным пока для меня критериям), то прямо оттуда же вызывается эта же функция, только в качестве объекта уже указываем родителя. И так далее. Как только доходим до конца цепочки, возвращаем найденного "предка".
В функции делаем только одно обращение к БД. Но в итоге их будет сделано ровно столько, сколько требуется для поиска. Получим рекурсивный вызов функции.

Я понимаю, что понятие "рекурсивный запрос" это "немножко" не то, что я предлагаю smile.gif, но я не знаю, можно ли его сделать в Постгре.

Спустя 14 минут (28.07.2009 - 09:03) Michael написал(а):
Если у 4 прародитель 1, а не 0 (т.е. нет данных о 0 в столбце id) то
попробуй так (алгоритм php-mysql):
PHP
// connect   select_db
$query='select id,parent_id from mytbl';
$result=mysql_query($query) or die('Ошибка в запросе');
$mmas='';
while ($vrow=mysql_fetch_row($result))
{
    $mmas[$vrow[0]]=$vrow[1];    
}
// Массив (потомок - родитель) сформирован

$vvod=$_POST['predok'];// например получили элемент
if (!isset($mmas[$vvod])) {
    echo 'Элемента нет в базе';
}
 else {
    $vihod=false;
    $el=$vvod;// - наш элемент
    $res='';$pr='';
    while (!($vihod))
    { 
        $pr
=$mmas[$el]; //Предок для el
        $fl=(isset($mmas[$pr]))?1:0; // Имеется ли запись где предок на первой позиции
        if ($fl) {
            $el=$pr;
        } else {
            $res=$el;
            $vihod=true;
        }
    }
    if ($res==$vvod) {
        echo 'Предка не найдено';
    } else {
        echo 'Предок:',res;
    }
}

Спустя 1 час, 16 минут, 28 секунд (28.07.2009 - 10:19) olgatcpip написал(а):
Michael, спасибо php кодом я как угодно могу выцепить правродителя, хоть рекурсией. Но мне нужно чтобы БД возвращала уже прародителя, так быстее должно работать.


_____________
Ласковое слово и кошке приятно... Плюсик в карму сойдет wink.gif
*smarty дока - новая любовь
Моё рукотворение ругайте, хвалите smile.gif
Веду маленький блог
в этом блоге публикую новые работы
WMR217126627282 wink.gif

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.