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

Статус
В этой теме нельзя размещать новые ответы.

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
Есть таблица допустим новости (поля 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 или банальный вложеный селект...

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

как получить данные внутренегого запроса ? не испортив результат внешнего.
ну и походу здесь имеется ввиду "без join" ...
ответ - изменить архитектуру ... чтоб у каждого экземпляра был свой айдишник ...
ну или переписать кусок кода предоставленный ниже так чтоб вначале получить все данные из 1 запроса а потом в цыкле играться с ними и делать 2 запрос
 
да с join все ясно, это решение, но больше интересен сам механизм работы
$engine это корневой объект, который содежит в себе другие расширения
в данном случае db, каждый объект может иметь только 1 копию, иначе в данном механизме нет смыла.
id назначается каждому запросу, и прошлый учичтожается,
но даже при отключении особождения ресурсов, не еспользовать free, результат не изменяется, да и сам id ничего не даст кроме как ссылки

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

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

тему можно закрывать)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху