Помогите объединить два фильтра по допсвойствам

#
Помогите объединить два фильтра по допсвойствам
Вот здесь вопрос задавали такой же как у меня

http://www.hostcms.ru/forums/2/7121/page-2
>>Помогите объединить два фильтра по допсвойствам. Пробовал по-разному, но что-то делаю не так.

^
|
|
У меня все точно так же!

Ответ модератора:
>>И далее: Блоки с указанием св-ва и значения идут через OR!


Что это значит? Куда это размещается?

У меня через ->setOr() выдается объединение, а мне нужно пересечение, если использую AND, то ничего не возвращается.

Выложите пример пожалуйста, где идет ограничение как по текстовому, так и числовому полю.


$Informationsystem_Controller_Show
         ->informationsystemItems()
            ->queryBuilder()
               ->leftJoin..
...
->where('informationsystem_item_properties.property_id', '=', 19)
->where('property_value_ints.value', '=', '123'
....
->setAnd()
->where('informationsystem_item_properties.property_id', '=',65)
->where('property_value_strings.value', '=','117 480';
....
->having(Core_Querybuilder::expression('COUNT(DISTINCT `informationsystem_item_properties`.`property_id`)', '=', 2);

Так?
Не работает!

Экспериметировал с SQL-запросами:

Вот так работает:

....
WHERE  

`informationsystem_item_properties`.`property_id` = 77
AND `property_value_ints`.`value` = 240

GROUP BY `informationsystem_items`.`id`
HAVING  COUNT(DISTINCT `informationsystem_item_properties`.`property_id`) = 1




И так тоже:

...
WHERE  

`informationsystem_item_properties`.`property_id` = 65
AND `property_value_strings`.`value` = '117 480'

GROUP BY `informationsystem_items`.`id`
HAVING  COUNT(DISTINCT `informationsystem_item_properties`.`property_id`) = 1



А вместе - никак:


SELECT
SQL_CALC_FOUND_ROWS
`informationsystem_items`.*
FROM `informationsystem_items`
LEFT OUTER JOIN `informationsystem_item_properties` ON `informationsystem_items`.`informationsystem_id` = `informationsystem_item_properties`.`informationsystem_id`
LEFT OUTER JOIN `property_value_ints` ON `informationsystem_items`.`id` = `property_value_ints`.`entity_id` AND  `informationsystem_item_properties`.`property_id` = `property_value_ints`.`property_id`
LEFT OUTER JOIN `property_value_strings` ON `informationsystem_items`.`id` = `property_value_strings`.`entity_id` AND  `informationsystem_item_properties`.`property_id` = `property_value_strings`.`property_id`
WHERE  

(`informationsystem_item_properties`.`property_id` = 77
AND `property_value_ints`.`value` = 240)


AND (`informationsystem_item_properties`.`property_id` = 65
AND `property_value_strings`.`value` = '117 480')

GROUP BY `informationsystem_items`.`id`
HAVING  COUNT(DISTINCT `informationsystem_item_properties`.`property_id`) = 2

Модератор
#
Re: Помогите объединить два фильтра по допсвойствам
catfelix150,
Вы почти достигли того, что нужно. Однако у Вас логическая ошибка:
(`informationsystem_item_properties`.`property_id` = 77
AND `property_value_ints`.`value` = 240)

AND (`informationsystem_item_properties`.`property_id` = 65
AND `property_value_strings`.`value` = '117 480')


ну никак одно поле одновременно не может быть равно 77 и 65, Вы согласны? Чтобы решить эту проблему, блоки условий по свойствам объединяются через OR! Но ведь тогда выберутся элементы с любыми комбинациями: свойство 1, свойство 2 или оба сразу. Для решения этого вопроса в конце и идет HAVING COUNT(...) = 2, где 2 - количество различных свойств.

$Informationsystem_Controller_Show
         ->informationsystemItems()
            ->queryBuilder()
               ->leftJoin..
...
// Первое свойство
->open()
->where('informationsystem_item_properties.property_id', '=', 19)
->where('property_value_ints.value', '=', '123')
->close()
....
// Блоки свойств через ИЛИ
->setOr()

// Второе свойство
->open()
->where('informationsystem_item_properties.property_id', '=',65)
->where('property_value_strings.value', '=','117 480')
->close()
....
// Количесво уникальных свойст
->having(Core_Querybuilder::expression('COUNT(DISTINCT `informationsystem_item_properties`.`property_id`)'), '=', 2);
#
Re: Помогите объединить два фильтра по допсвойствам
Спасибо! Получилось!
Модератор
#
Re: Помогите объединить два фильтра по допсвойствам
catfelix150,
даже не сомневался пожалуйста!
#
Re: Помогите объединить два фильтра по допсвойствам
   ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
   ->leftJoin('property_value_strings', 'informationsystem_items.id', '=', 'property_value_strings.entity_id',
                  array(array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_strings`.`property_id`')))))
   ->where('informationsystem_item_properties.property_id', '=', 262) // идентификатор дополнительного свойства
   ->where('property_value_strings.value', '=', 'Prunus') // значение дополнительного свойства


А как сделать так, чтобы вместо фиксированного значения Prunus была выборка по текущему значению.
Авторизация