Пример не неудачный, он просто простой. Вот пример посложнее:
$q2 = $this->modx->newQuery($this->classKey);
$offersAlias = "offer";
$q2->setClassAlias($offersAlias);
$q2->select(array(
"property_198",
"GROUP_CONCAT({$offersAlias}.id SEPARATOR '||') as offers_id",
"GROUP_CONCAT({$offersAlias}.price SEPARATOR '||') as prices",
"GROUP_CONCAT({$offersAlias}.article SEPARATOR '||') as articles",
"GROUP_CONCAT({$offersAlias}.packaging SEPARATOR '||') as packages",
));
$q2->where(array(
"{$offersAlias}.published" => 1,
"{$offersAlias}.deleted" => 0,
"{$offersAlias}.hidemenu" => 0,
"{$offersAlias}.property_198:!=" => "",
));
$q2->groupby("{$offersAlias}.property_198");
$q2->prepare();
$sql = $q2->toSQL();
$c->query['from']['joins'][] = array(
"type" => "left join",
"table" => "({$sql})",
"alias" => "t1",
"conditions" => array(
new xPDOQueryCondition(array(
"sql" => "{$alias}.property_198 = t1.property_198",
)),
),
);
$c->select(array(
"if(t1.offers_id IS NOT NULL, t1.offers_id, {$alias}.id) as offers_id",
"if(t1.prices IS NOT NULL, t1.prices, {$alias}.price) as prices",
"if(t1.articles IS NOT NULL, t1.articles, {$alias}.article) as articles",
"if(t1.packages IS NOT NULL, t1.packages, {$alias}.packaging) as packages",
));
SQL:
SELECT
if(modResource.remains > 0 , 1, 0) as in_store,
if(t1.offers_id IS NOT NULL, t1.offers_id, modResource.id) as offers_id,
if(t1.prices IS NOT NULL, t1.prices, modResource.price) as prices,
if(t1.articles IS NOT NULL, t1.articles, modResource.article) as articles,
if(t1.packages IS NOT NULL, t1.packages, modResource.packaging) as packages,
FROM
`modx_site_content` AS `modResource`
left join (
SELECT `property_198`,
GROUP_CONCAT(offer.id SEPARATOR '||') as offers_id,
GROUP_CONCAT(offer.price SEPARATOR '||') as prices,
GROUP_CONCAT(offer.article SEPARATOR '||') as articles,
GROUP_CONCAT(offer.packaging SEPARATOR '||') as packages
FROM
`modx_site_content` AS `offer`
WHERE (
`offer`.`published` = 1
AND `offer`.`deleted` = 0
AND `offer`.`hidemenu` = 0
AND `offer`.`property_198` != ''
)
GROUP BY offer.property_198
) `t1`
ON modResource.property_198 = t1.property_198
WHERE (
(
`modResource`.`deleted` = 0
AND `modResource`.`hidemenu` = 0
AND `modResource`.`published` = 1
)
AND `modResource`.`template` in (3,21)
)
Здесь выборка несколько килотоваров с группировкой по полю (тут товары с вариациями товаров). И вот когда у всех товаров были заполнено это дополнительное поле, участвующее в группировке, тогда да, обычным запросом обходился. А теперь появились товары, у которых это поле не было заполнено. Пришлось переписывать запрос, так как если я сейчас сделаю группировку по этому незаполненному полю, у меня будут сотни товаров в одной карточке, а если я исключу такие товары, то они у меня просто не попадут в выборку.