Запрос с вложеными запросами

Тема в разделе "Базы данных", создана пользователем CrashX, 27 сен 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    Есть таблица допустим новости (поля id,content,autor,pdate,cat)
    есть таблица категории (поля id,pid,name,sort)
    есть таблица пользователи (поля id,login,name, дальне неважно)


    делаю
    Код:
    [info] => NewsView
    [query] => SELECT id, cid, title, content, reference, author, hits, created FROM news ORDER BY `created` DESC;
    после
    Код:
                [info] => user->select(ID:1, UL:, UP:)
                [query] => SELECT id, gid, ulogin, upassword, uemail, unick, uname, usurname, ulocation, uoffset, ulanguage, utemplate, uregister, uvisit FROM users WHERE id='1' ;
    и тоже самое с категорией

    id пользовалеля берется из таблицы с новостями)
    ---
    проблема в том что

    PHP:
      if ($engine->db->query()):
        
    //  $this->result = $engine->db->id;
          
    while ($this->record $engine->db->result()):
            
    _print($this->record);
          
    //  $engine->db->id = $this->result;
            
    foreach ($this->record as $column => $value):
              
    //echo $column . '=>' . $value . "<br>";
              
    switch ($column):
                case 
    "content"$engine->string->cut($value);
                  break;
                case 
    "created"$engine->dateformat($value);
                  break;
                case 
    "reference"$value _REFERENCE ": " $value;
                  break;
                case 
    "hits"$value $engine->translator(explode(","_HIT), $value) . ": " $value;
                  break;
                case 
    "author":
                  
    //    xdebug_break();
                  
    $engine->extend($engine->user);
                  
    $engine->user->select(array('id' => $value));
                  
    _print($engine->user->field);
                  
    $value _AUTHOR ": " $engine->user->field['ulogin'];
                  break;
                default:         
                  break;
              endswitch;
              
    $engine->template->set('{' $column '}'$value);
            endforeach;
            
    $engine->template->compile($this->config);
          endwhile;
    при выполнее запроса внутри результ верхнего заменяется...
    подстановка прошлого id в
    PHP:
      /**
       * Возвращение результата в виде массива
       * @param  MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
       * @return  mixed результат
       */
      
    function result($type=MYSQL_ASSOC) {
        return @
    mysqli_fetch_array($this->id$type);
      }
    результат не дает...

    знаю что можно и нужно использовать вложеные запросы, типа join или банальный вложеный селект...

    как получить данные внутренегого запроса ? не испортив результат внешнего.
     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    а шо такое $engine? - это типа Registry ?
    теоретически (так как не известно в каком формате хранятся данные в $engine как инициализируются ...) это из-за того что и верхний и внутренний используют один и тот же экземпляр класса для работы с БД , т.е $this->id у них общий и он соответственно перетирается вторым ( ну или следующим) запросом

    ну и походу здесь имеется ввиду "без join" ...
    ответ - изменить архитектуру ... чтоб у каждого экземпляра был свой айдишник ...
    ну или переписать кусок кода предоставленный ниже так чтоб вначале получить все данные из 1 запроса а потом в цыкле играться с ними и делать 2 запрос
     
  3. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    да с join все ясно, это решение, но больше интересен сам механизм работы
    $engine это корневой объект, который содежит в себе другие расширения
    в данном случае db, каждый объект может иметь только 1 копию, иначе в данном механизме нет смыла.
    id назначается каждому запросу, и прошлый учичтожается,
    но даже при отключении особождения ресурсов, не еспользовать free, результат не изменяется, да и сам id ничего не даст кроме как ссылки

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

    с Join все просто, просто хотелось, именно 2-3 простыми запросами сделать все, теперь придется конструктор запросов расширять до версии с Join

    тему можно закрывать)
     
Статус темы:
Закрыта.