Объединить выборки в контроллере показа.

#
Re: Объединить выборки в контроллере показа.
Спасибо за диалог

Цитата:
выбираете товары, где id группы у товара совпадает с ID группы в таблице групп или любая запись в таблице групп не удалена или у товара ID группы равен 0.



а мне нужно - Выбрать товары, где id группы у товара совпадает с ID группы в таблице групп И запись не удалена или у товара ID группы равен 0.

$Informationsystem_Controller_Show
                              ->informationsystemItems()
                              ->queryBuilder()
                              ->leftJoin('informationsystem_groups', 'informationsystem_group_id','=','informationsystem_groups.id', array(
                                 array('AND' => array('informationsystem_groups.deleted', '=', 0)),
                                 array('OR' => array('informationsystem_group_id', '=', 0))
                                             ));


Но все равно не тот результат... Выводятся с удаленной группы и дублируются с ид группы 0....

Что я делаю не так? Я немного запутался с логикой этого условия... Мне казалось, достаточно объединить два запроса, как я писал изначально. Помогите разобраться, пожалуйста
Модератор
#
Re: Объединить выборки в контроллере показа.
prizrak067,
$Informationsystem_Controller_Show
   ->informationsystemItems()
   ->queryBuilder()
   ->leftJoin('informationsystem_groups', 'informationsystem_group_id','=','informationsystem_groups.id', array(
         array('AND' => array('informationsystem_groups.deleted', '=', 0))
      )
   )
   ->open()
      ->where('informationsystem_group_id', '=', 0)
      ->setOr()
      ->where('informationsystem_groups.id', 'IS NOT', NULL)
   ->close();
#
Re: Объединить выборки в контроллере показа.
Спасибо большое.
С этой частью всё предельно понятно, это я делал и сам:
Цитата:

  ->informationsystemItems()
   ->queryBuilder()
   ->leftJoin('informationsystem_groups', 'informationsystem_group_id','=','informationsystem_groups.id', array(
         array('AND' => array('informationsystem_groups.deleted', '=', 0))
      )
   )


Было очевидно, что нужно добавить условие. Но проблема была - как.
Во второй части:
   ->open()
      ->where('informationsystem_group_id', '=', 0)
      ->setOr()
      ->where('informationsystem_groups.id', 'IS NOT', NULL)
   ->close();


Это как раз то, чего мне не хватало. Расскажите, пожалуйста, как это работает? Мне сразу кажется, что это еще условие для уже сделанной выборки leftjoin. Но в ней ведь уже нет записей с ид группы = 0, в силу условия объединения по общему полю ид группы. Поэтому выборка дала бы пустой результат. Очевидно, что роль играют методы open()  и close(), но как они работают?
Модератор
#
Re: Объединить выборки в контроллере показа.
prizrak067 писал(а):
Расскажите, пожалуйста, как это работает?

Объединяете две таблицы, если соответствующего значения из второй таблицы нет, то там будет NULL. Затем в скобках проверяем - группа у товара не указана, либо в объединяемой таблице есть значение (не NULL).

prizrak067 писал(а):
Очевидно, что роль играют методы open()  и close(), но как они работают?

это обычные скобки в SQL: ( и )
#
Re: Объединить выборки в контроллере показа.
Понял. Всё просто вообще) Спасибо.
Можно еще попросить рассказать... Я же изначально хотел сделать два запроса и объединить выборки union. В чем ошибка?
Модератор
#
Re: Объединить выборки в контроллере показа.
prizrak067,
Ошибка в том, что второй запрос вы бы очень сложно городили, а потребности в этом нет, задача решается так, как написана выше. Ограничения и сложности UNION смотрите по ссылке.
#
Re: Объединить выборки в контроллере показа.
Спасибо большое Хорошего вечера и рабочей недели
Авторизация