За последние 24 часа нас посетили 22211 программистов и 1685 роботов. Сейчас ищут 1645 программистов ...

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

Тема в разделе "MySQL", создана пользователем All_ex74, 25 мар 2015.

  1. All_ex74

    All_ex74 Новичок

    С нами с:
    9 май 2014
    Сообщения:
    5
    Симпатии:
    0
    Здравствуйте,

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

    [​IMG]

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

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

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

    Код (Text):
    1.  
    2. <?php
    3. //для этого по его ID  узнаём его Флаг и ID уже его спонсора...
    4. $sp_flag1 = "SELECT `ID спонсора`,`Флаг` FROM `" . DATA_TABLE . "1` WHERE `id`='" . $sp['ID спонсора'] . "' AND `status`=0 LIMIT 1";
    5. $spflag1 = sql_query($sp_flag1) or user_error(mysql_error() . "<br>" .    $sp_flag1 . "<br>", E_USER_ERROR);
    6. $flag1 = sql_fetch_assoc($spflag1);
    7.  
    8. if ($flag1['Флаг'] == 1) {//если Флаг = 1, выполняем код...
    9.  
    10.     /*** КОД ***/
    11.  
    12. } elseif ($flag1['Флаг'] == 0) { //но если Флаг = 0, ищем дальше...
    13.  
    14.     //узнаём Флаг спонсора и ID уже его спонсора...
    15.     $sp_flag2 = "SELECT `ID спонсора`,`Флаг` FROM `" . DATA_TABLE . "1` WHERE `id`='" . $flag1['ID спонсора'] . "' AND `status`=0 LIMIT 1";
    16.     $spflag2 = sql_query($sp_flag2) or user_error(mysql_error() . "<br>" . $sp_flag2 . "<br>", E_USER_ERROR);
    17.     while ($flag2 = sql_fetch_assoc($spflag2)) {
    18.  
    19.         if ($flag2['Флаг'] == 1) {//если Флаг = 1, выполняем код...
    20.  
    21.         /*** КОД ***/
    22.  
    23.         } elseif ($flag2['Флаг'] == 0) { //но если Флаг = 0, ищем дальше...
    24.  
    25.         /*** И так пока не будет найден первый спонсор с Флагом = 1. Как сделать поиск до бесконечности, чтобы конструкция не разрасталась? ***/
    26.  
    27.         }
    28.     }
    29. }
    30. ?>
    Как сделать поиск до бесконечности, чтобы конструкция не разрасталась? Если можно, то одним запрсом...
    Или может что то посоветуете...
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    while
     
  3. All_ex74

    All_ex74 Новичок

    С нами с:
    9 май 2014
    Сообщения:
    5
    Симпатии:
    0
    Fell-x27, можно подробнее?
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    W H I L E
     
  5. All_ex74

    All_ex74 Новичок

    С нами с:
    9 май 2014
    Сообщения:
    5
    Симпатии:
    0
    Да я понимаю что цикл, но как его применить к выборке из базы не пойму. Можете примерчик оформить?..
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Это вот твое условие выхода из while.

    В каждой итерации просто меняй данные в запросе, которые планировал менять без цикла, разращивая код.
     
  7. All_ex74

    All_ex74 Новичок

    С нами с:
    9 май 2014
    Сообщения:
    5
    Симпатии:
    0
    Спасибо, понял!..