Решил на днях попробовать в D7 выборку с group_by.
Задача - выдрать из базы активные элементы с максимальной сортировкой, из определенного раздела и сделать группировку по NAME. Вроде ничего необычного.
\Bitrix\Main\Application::getInstance()->getConnectionPool()->getConnection()->startTracker(false);
$query = new \Bitrix\Main\Entity\Query(\Bitrix\Iblock\ElementTable::getEntity());
$query->registerRuntimeField('COUNT', array(
'data_type'=>'integer',
'expression' => array('COUNT(*)')
));
$query->registerRuntimeField('SORT', array('data_type'=>'integer'));
$query->setSelect(array('ID','NAME','COUNT','CODE'));
$query->setFilter(array('IBLOCK_ID'=>114, 'ACTIVE'=>'Y','IBLOCK_SECTION_ID'=>10216));
$query->setOrder(array('SORT'=>'DESC'));
$query->setGroup(array('NAME'));
$query->setLimit(30);
$obResult = $query->exec();
print_r($obResult->getTrackerQuery()->getSql());
\Bitrix\Main\Application::getInstance()->getConnectionPool()->getConnection()->stopTracker(); |
Вроде все логично и должно работать, но я был удивлен тем, какой sql получился на выходе:
SEL ECT
`iblock_element`.`ID` AS `ID`,
`iblock_element`.`NAME` AS `NAME`,
COUNT(*) AS `COUNT`,
`iblock_element`.`CODE` AS `CODE`
FR OM `b_iblock_element` `iblock_element`
WHERE `iblock_element`.`IBLOCK_ID` = 114
AND UPPER(`iblock_element`.`ACTIVE`) like upper('Y')
AND `iblock_element`.`IBLOCK_SECTION_ID` = 10216
GROUP BY `iblock_element`.`NAME`, `iblock_element`.`SORT`, `iblock_element`.`ID`, `iblock_element`.`CODE`
ORDER BY `iblock_element`.`SORT` DESC
LIMIT 0, 30 |
Зачем в GROUP_BY пихать все поля из SELECT? Это баг, фича или я чего-то не понимаю в построении запросов?
Естественно этот код выдал не тот результат.
А вот ежели просто выполнить запрос:
SELECT
`iblock_element`.`ID` AS `ID`,
`iblock_element`.`NAME` AS `NAME`,
COUNT(*) AS `COUNT`,
`iblock_element`.`CODE` AS `CODE`
FR OM `b_iblock_element` `iblock_element`
WH ERE `iblock_element`.`IBLOCK_ID` = 114
AND UPPER(`iblock_element`.`ACTIVE`) like upper('Y')
AND `iblock_element`.`IBLOCK_SECTION_ID` = 10216
GROUP BY `iblock_element`.`NAME`
ORDER BY `iblock_element`.`SORT` DESC
LIMIT 0, 30; |
То все работает как надо.
Стоит стабильная версия 14.9.3