Для начала, с днем рождения! Всего наилучшего! По сабжу: все это клево, но не оптимально. 1. На все это давно уже есть getdata-процессор. 2. Раз уж вы в рамках xPDO работаете, то и стройте запросы на нем. Во-первых, запрос SELECT * FROM modx_site_content LEFT JOIN modx_site_tmplvar_contentvalues ON modx_site_tmplvar_contentvalues.contentid = modx_site_content.id WHERE ( modx_site_tmplvar_contentvalues.tmplvarid = ( SELECT modx_site_tmplvars.id FROM modx_site_tmplvars WHERE modx_site_tmplvars.name='icon' ) AND modx_site_tmplvar_contentvalues.value = 'example-icon' ) OR ( modx_site_tmplvar_contentvalues.tmplvarid = ( SELECT modx_site_tmplvars.id FROM modx_site_tmplvars WHERE modx_site_tmplvars.name='isCosmos' ) AND modx_site_tmplvar_contentvalues.value = 'IS' ) Переделаем на SELECT * FROM modx_site_content c INNER JOIN modx_site_tmplvar_contentvalues tvv ON tvv.contentid = c.id INNER JOIN modx_site_tmplvars tv ON tvv.tmplvarid = tv.id WHERE ( tv.name='icon' AND tvv.value = 'example-icon' ) OR ( tv.name='isCosmos' AND tvv.value = 'IS' ) Здесь нет смысла использовать LEFT JOIN, ибо по условию вы все равно требуете значения, а значит отсутствующие записи не пройдут. Но если хотите универсальности в плане того, что будут запросы без дополнительных условий и чтобы в выборку попадали документы, для которых нет ни одной ТВшки, то да, нужно LEFT JOIN использовать. Во-вторых, переделаем это на xPDO: $c = $modx->newQuery('modResource'); $c->leftJoin('modTemplateVarResource', 'TemplateVarResources'); $c->leftJoin('modTemplateVar', 'tv', "tv.id=TemplateVarResources.tmplvarid");

$c->where(array( array( "tv.name" => 'icon', "TemplateVarResources.value" => "example-icon", ), array( "OR:tv.name:=" => 'isCosmos', "TemplateVarResources.value" => "IS", ), ));