Как оптимизировать запрос MySQL, сократив код?

All_ex74

Новичок
Здравствуйте,

Подскажите, может кто то уже сталкивался.
Вкратце объясню суть. Имеется таблица: Участники. Каждый участник имеет своего спонсора в этой же таблице, а тот в свою очередь своего. За отслеживание отвечает поле ID спонсора.



Нужно относительно текущего участника вытащить из таблицы ID ближайшего к исходному участнику спонсора, чей флаг (поле Флаг) не равен нулю.

Например: Участник с ID = 1, проверяем флаг его спонсора и если он равен 0, переходим уже к его спонсору и так до бесконечности - пока не встретим первого последующего с флагом = 1.

Пока я реализую это такой громоздкой конструкцией с кучей запросов (только учусь):

Код:
//для этого по его ID  узнаём его Флаг и ID уже его спонсора...
$sp_flag1 = "SELECT `ID спонсора`,`Флаг` FROM `" . DATA_TABLE . "1` WHERE `id`='" . $sp['ID спонсора'] . "' AND `status`=0 LIMIT 1";
$spflag1 = sql_query($sp_flag1) or user_error(mysql_error() . "<br>" .    $sp_flag1 . "<br>", E_USER_ERROR);
$flag1 = sql_fetch_assoc($spflag1);

if ($flag1['Флаг'] == 1) {//если Флаг = 1, выполняем код...

    /*** КОД ***/

} elseif ($flag1['Флаг'] == 0) { //но если Флаг = 0, ищем дальше...

    //узнаём Флаг спонсора и ID уже его спонсора...
    $sp_flag2 = "SELECT `ID спонсора`,`Флаг` FROM `" . DATA_TABLE . "1` WHERE `id`='" . $flag1['ID спонсора'] . "' AND `status`=0 LIMIT 1";
    $spflag2 = sql_query($sp_flag2) or user_error(mysql_error() . "<br>" . $sp_flag2 . "<br>", E_USER_ERROR);
    while ($flag2 = sql_fetch_assoc($spflag2)) {

        if ($flag2['Флаг'] == 1) {//если Флаг = 1, выполняем код...

        /*** КОД ***/

        } elseif ($flag2['Флаг'] == 0) { //но если Флаг = 0, ищем дальше...

        /*** И так пока не будет найден первый спонсор с Флагом = 1. Как сделать поиск до бесконечности, чтобы конструкция не разрасталась? ***/

        }
    }
}
Как сделать поиск до бесконечности, чтобы конструкция не разрасталась? Если можно, то одним запрсом...
Или может что то посоветуете...
 

WMix

герр M:)ller
Партнер клуба
в твоем случае кроме как рекурсия/перебор никак.. но погугли на nested sets
 

WBS

Новичок
Как сделать поиск до бесконечности, чтобы конструкция не разрасталась?
Код:
$cur_id = $sp['ID спонсора'];

do {
  $sql = "SELECT `ID спонсора`,`Флаг` FROM `" . DATA_TABLE . "1` WHERE `id`='" . $cur_id . "' AND `status`=0 LIMIT 1";
  $result = sql_query($sql) or user_error(mysql_error() . "<br>" . $sql . "<br>", E_USER_ERROR);
  $row = sql_fetch_assoc($result);
  $cur_id = $row['ID спонсора'];
} while ($row['Флаг']==0);

// если Флаг = 1, вышли из цикла и выполняем код...
 
Сверху