PDA

Показать полную графическую версию : рекурсивный спуск в таблицу


Surround
31-05-2010, 18:50
День добрый! есть такая связка таблиц (в аттаче). У устройства есть порты, которые соединяются между собой, тем самым подключая устройства друг к другу. Реляционная модель. Заполняется данными. Так вот нужно получить список всех устройства, например, идущих вниз по иерархии...
Написал простенькую рекурсию.
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
схема таблиц

Sham
01-06-2010, 02:34
непонятны типы полей (может какие уникальные), и по каким возможна связка.
имхо проще с do{....}while() разрулить.

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

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

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

Sham
01-06-2010, 10:02
$result = mysql_query($sql);
$new_device=mysql_fetch_array($result);
print $new_device[0]."<br>"; »
рекурсию по идее надо для каждой строки ответа в цикле применять, чтобы дерево получить, а у вас результат запроса понимается как одна строка... Одна строка по идее дб только при первом вызове (верхний узел).

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




© OSzone.net 2001-2012