Dmitry K.,
1) вы добавили where внутри скобок и ограничение по informationsystem_items.id работает только с последним свойством ->where('property_value_floats.value', '<=', $maxProperty273)
2) ->setAnd() можно не писать, после каждого ->where() оператор сбрасывается на AND
3) есть замечательное сравнение BETWEEN, делает код намного читабельнее
<?php
/* 2 - Похожие по свойствам виды древесины - показ схожих инфоэлементов на основе доп. свойств */
$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(Core_Entity::factory('Informationsystem', 55));
$Informationsystem_Controller_Show
->xsl(Core_Entity::factory('Xsl')->getByName('ПохожиеПоСвойствамВидыДревесины'))
->itemsProperties(true)
->limit(99);
$iItem = intval(Core_Page::instance()->object->item);
if ($iItem)
{
$oProperty = Core_Entity::factory('Property', 264);
$aPropertyValues264 = $oProperty->getValues($iItem);
$oProperty = Core_Entity::factory('Property', 273);
$aPropertyValues273 = $oProperty->getValues($iItem);
if (isset($aPropertyValues264[0]) && trim($aPropertyValues264[0]->value) != ''
&& isset($aPropertyValues273[0]) && trim($aPropertyValues273[0]->value) != '')
{
$coef = 0.1;
$delta264 = intval($aPropertyValues264[0]->value) * $coef;
$minProperty264 = $aPropertyValues264[0]->value - $delta264;
$maxProperty264 = $aPropertyValues264[0]->value + $delta264;
$delta273 = intval($aPropertyValues273[0]->value) * $coef;
$minProperty273 = $aPropertyValues273[0]->value - $delta273;
$maxProperty273 = $aPropertyValues273[0]->value + $delta273;
$Informationsystem_Controller_Show
->informationsystemItems()
->queryBuilder()
->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
->leftJoin('property_value_ints', 'informationsystem_items.id', '=', 'property_value_ints.entity_id',
array(array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))))
->leftJoin('property_value_floats', 'informationsystem_items.id', '=', 'property_value_floats.entity_id',
array(array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_floats`.`property_id`')))))
->open()
->where('informationsystem_item_properties.property_id', '=', 264)
->where('property_value_ints.value', 'BETWEEN', array($minProperty264, $maxProperty264))
->setOr()
->where('informationsystem_item_properties.property_id', '=', 273)
->where('property_value_floats.value', 'BETWEEN', array($minProperty273, $maxProperty273))
->close()
->where('informationsystem_items.id', '!=', $iItem)
->groupBy('informationsystem_items.id')
->having(Core_Querybuilder::expression('COUNT(DISTINCT `informationsystem_item_properties`.`property_id`)'), '=', 2);
$Informationsystem_Controller_Show->show();
}
}