Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   рекурсивный спуск в таблицу (http://forum.oszone.net/showthread.php?t=177028)

Surround 31-05-2010 18:50 1424816

рекурсивный спуск в таблицу
 
День добрый! есть такая связка таблиц (в аттаче). У устройства есть порты, которые соединяются между собой, тем самым подключая устройства друг к другу. Реляционная модель. Заполняется данными. Так вот нужно получить список всех устройства, например, идущих вниз по иерархии...
Написал простенькую рекурсию.
PHP код:

function r($device1$device2)
{

$sql="SELECT dev_code FROM devices WHERE dev_code IN (
    SELECT owner_dev_code FROM ports WHERE con_port_id IN (
        SELECT id FROM ports WHERE owner_dev_code = '$device1'
    )
) AND dev_role = 'AC' AND dev_code != '$device2'"
;
$device2=$device1;
$result mysql_query($sql);
$new_device=mysql_fetch_array($result);
print 
$new_device[0]."<br>";
if (
$new_device[0]!='')
{
    
r($new_device[0],$device2);


dev_code - код устройства
owner_dev_code - код устройства-владельца порта
Она проходит только под одной ветке до тупика. А вот вверх как пониматься для продолжения по другой ветке, я не придумаю...
Подсобите идеей, пожалуйста :shot:

Surround 31-05-2010 18:56 1424821

Вложений: 1
схема таблиц

Sham 01-06-2010 02:34 1425054

непонятны типы полей (может какие уникальные), и по каким возможна связка.
имхо проще с do{....}while() разрулить.

имхо в цикле мб запросы со связкой 2 таблиц по коду устройства, с динамическим формированием WHERE. Устройства можно собирать в массив, где оставлять только уникальные значения.

Запросы с подзапросами нагружают базу...

Surround 01-06-2010 07:40 1425090

Поле "Код" таблицы Devices уникально, хотя, конечно, не очень красиво сделано - внешний ключ не отражается в первичный, но все же. "Модель" - текст, ну а все остальное - Int.
Ну да, связку в цикле я тоже пробовал, но вот обратно выйти на уровень выше, если по одной из веток найден конец, не выходит

Sham 01-06-2010 10:02 1425128

Цитата:

Цитата Surround
$result = mysql_query($sql);
$new_device=mysql_fetch_array($result);
print $new_device[0]."<br>"; »

рекурсию по идее надо для каждой строки ответа в цикле применять, чтобы дерево получить, а у вас результат запроса понимается как одна строка... Одна строка по идее дб только при первом вызове (верхний узел).

Surround 01-06-2010 12:27 1425202

Цитата:

рекурсию по идее надо для каждой строки ответа в цикле применять
это-то верно... только код все равно зацикливается... может, где не так написал.. :unsure:


Время: 14:35.

Время: 14:35.
© OSzone.net 2001-