[QUOTE] написал:
Всем привет!
Столкнулся вот с какой проблемой. Пытаюсь сделать выборку - нужно получить все элементы инфоблока с группировкой по полю DATE_CREATE. Делаю на D7, вот код:
[CODE] $dbItems = \Bitrix\Iblock\ElementTable::getList( array (
//'order' => array('SORT' => 'ASC'), // сортировка
//'order' => array(),
'sel ect' => array ( 'ID' , 'NAME' , 'DATE_CREATE' , 'PREVIEW_TEXT' , 'PREVIEW_PICTURE' , 'IBLOCK_ID' , 'SORT' ), // выбираемые поля, без свойств. Свойства можно получать на старом ядре \CIBlockElement::getProperty
'filter' => array ( 'IBLOCK_ID' => $this ->arParams[ 'IBLOCK_ID' ]), // фильтр только по полям элемента, свойства (PROPERTY) использовать нельзя
'group' => array ( 'DATE_CREATE' ), // группировка по полю, order должен быть пустой
//'limit' => 1000, // целое число, ограничение выбираемого кол-ва
'offset' => 0 , // целое число, указывающее номер первого столбца в результате
'count_total' => 1 , // дает возможность получить кол-во элементов через метод getCount()
'runtime' => array (), // массив полей сущности, создающихся динамически
'data_doubling' => false , // разрешает получение нескольких одинаковых записей
'cache' => array ( // Кеш запроса. Сброс можно сделать методом \Bitrix\Iblock\ElementTable::getEntity()->cleanCache();
'ttl' => 3600 , // Время жизни кеша
'cache_joins' => true // Кешировать ли выборки с JOIN
),
));
$items = Array ();
while ( $arItem = $dbItems ->fetch()){
$db_props = CIBlockElement::GetProperty( $arItem [ 'IBLOCK_ID' ], $arItem [ 'ID' ]);
while ( $ar_props = $db_props ->Fetch()){
$props = $ar_props ;
}
$arItem [ 'PROPS' ] = $props ;
$items [] = $arItem ;
} [/CODE]
Но вот когда распечатываю $items у меня на выходе вот что:
[CODE] Array (
[ 0 ] => Array
(
[ID] => 320
[NAME] => Новость 1
[DATE_CREATE] => Bitrix\Main\Type\DateTime Object
(
[userTimeEnabled: protected ] => 1
[value: protected ] => DateTime Object
(
[date] => 2021 - 08 - 08 15 : 14 : 10.000000
[timezone_type] => 3
[timezone] => Europe/Moscow
)
)
[PREVIEW_TEXT] => Анонс новости 1
[PREVIEW_PICTURE] => 956
[IBLOCK_ID] => 4
[SORT] => 500
[PROPS] => Array
(
[ID] => 26
[TIMESTAMP_X] => 2022 - 08 - 08 16 : 54 : 12
[IBLOCK_ID] => 4
[NAME] => Произвольный текст
[ACTIVE] => Y
[SORT] => 500
[CODE] => CUSTOMTEXT
[DEFAULT_VALUE] =>
[PROPERTY_TYPE] => S
[ROW_COUNT] => 1
[COL_COUNT] => 30 [LIST_TYPE] => L
[MULTIPLE] => N
[XML_ID] =>
[FILE_TYPE] =>
[MULTIPLE_CNT] => 5
[TMP_ID] =>
[LINK_IBLOCK_ID] => 0
[WITH_DESCRIPTION] => N
[SEARCHABLE] => N
[FILTRABLE] => N
[IS_REQUIRED] => N
[VERSION] => 1
[USER_TYPE] =>
[USER_TYPE_SETTINGS] =>
[HINT] =>
[PROPERTY_VALUE_ID] => 2062
[VALUE] => Мой произвольный текст
[DESCRIPTION] =>
[VALUE_ENUM] =>
[VALUE_XML_ID] =>
[VALUE_SORT] =>
)
)
[ 1 ] => Array
(
[ID] => 321
[NAME] => Новость 2
[DATE_CREATE] => Bitrix\Main\Type\DateTime Object
(
[userTimeEnabled: protected ] => 1
[value: protected ] => DateTime Object
(
[date] => 2022 - 08 - 08 15 : 14 : 10.000000
[timezone_type] => 3
[timezone] => Europe/Moscow
)
)
[PREVIEW_TEXT] => Анонс новости 2
[PREVIEW_PICTURE] => 958
[IBLOCK_ID] => 4
[SORT] => 500
[PROPS] => Array
(
[ID] => 26
[TIMESTAMP_X] => 2022 - 08 - 08 16 : 54 : 12
[IBLOCK_ID] => 4
[NAME] => Произвольный текст
[ACTIVE] => Y
[SORT] => 500
[CODE] => CUSTOMTEXT
[DEFAULT_VALUE] =>
[PROPERTY_TYPE] => S
[ROW_COUNT] => 1
[COL_COUNT] => 30 [LIST_TYPE] => L
[MULTIPLE] => N
[XML_ID] =>
[FILE_TYPE] =>
[MULTIPLE_CNT] => 5
[TMP_ID] =>
[LINK_IBLOCK_ID] => 0
[WITH_DESCRIPTION] => N
[SEARCHABLE] => N
[FILTRABLE] => N
[IS_REQUIRED] => N
[VERSION] => 1
[USER_TYPE] =>
[USER_TYPE_SETTINGS] =>
[HINT] =>
[PROPERTY_VALUE_ID] =>
[VALUE] =>
[DESCRIPTION] =>
[VALUE_ENUM] =>
[VALUE_XML_ID] =>
[VALUE_SORT] =>
)
)
[ 2 ] => Array
(
[ID] => 322
[NAME] => Новость 3
[DATE_CREATE] => Bitrix\Main\Type\DateTime Object
(
[userTimeEnabled: protected ] => 1
[value: protected ] => DateTime Object
(
[date] => 2022 - 08 - 08 15 : 14 : 10.000000
[timezone_type] => 3
[timezone] => Europe/Moscow
)
)
[PREVIEW_TEXT] => Анонс новости 3
[PREVIEW_PICTURE] =>
[IBLOCK_ID] => 4
[SORT] => 500
[PROPS] => Array
(
[ID] => 26
[TIMESTAMP_X] => 2022 - 08 - 08 16 : 54 : 12
[IBLOCK_ID] => 4
[NAME] => Произвольный текст
[ACTIVE] => Y
[SORT] => 500
[CODE] => CUSTOMTEXT
[DEFAULT_VALUE] =>
[PROPERTY_TYPE] => S
[ROW_COUNT] => 1
[COL_COUNT] => 30 [LIST_TYPE] => L
[MULTIPLE] => N
[XML_ID] =>
[FILE_TYPE] =>
[MULTIPLE_CNT] => 5
[TMP_ID] =>
[LINK_IBLOCK_ID] => 0
[WITH_DESCRIPTION] => N
[SEARCHABLE] => N
[FILTRABLE] => N
[IS_REQUIRED] => N
[VERSION] => 1
[USER_TYPE] =>
[USER_TYPE_SETTINGS] =>
[HINT] =>
[PROPERTY_VALUE_ID] =>
[VALUE] =>
[DESCRIPTION] =>
[VALUE_ENUM] =>
[VALUE_XML_ID] =>
[VALUE_SORT] =>
)
)
) [/CODE]
То есть элементы то выбираются, но никакой группировки нет. Или я может что-то не понимаю. Подскажите пожалуйста, каким образом \Bitrix\Iblock\ElementTable::g etList делает группировку, и как я это могу увидеть?[/QUOTE]
Вы не правильно понимаете работу оператора GROUP BY. Ознакомиться лучше в SQL. Попробую в двух словах обьяснить. [URL=https://www.w3schools.com/mysql/mysql_groupby.asp#:~:text=The%20MySQL%20GROUP%20BY%20Statement,by%20one%20or%20more%20columns.]Ссылка[/URL].
В GROUP BY задаем поле по которому должны "схлопываться" записи. А в SELECT поля которые отличаются от тех что в GROUP BY должны быть агрегированы, при помощи агрегированных функций. Иначе "схлопывания" не будет.
Вот пример:[CODE]name rating author
one 2 oneA
two 3 oneA
one 6 twoA[/CODE]Если написать следующий код[CODE]select name, rating, author fr om table
group by name;[/CODE]Это работать не будет, т.к. MySQL схлопнет столбец name по значениям, то как работать с другими полями она не знает.
Покажу как это работает через агрегирующие функции:[CODE]sel ect name, sum(rating) as SUMMA fr om table
group by name;[/CODE]Результат будет следующим:[CODE]name SUMMA
one 8
two 3
[/CODE]
Всем привет!
Столкнулся вот с какой проблемой. Пытаюсь сделать выборку - нужно получить все элементы инфоблока с группировкой по полю DATE_CREATE. Делаю на D7, вот код:
[CODE] $dbItems = \Bitrix\Iblock\ElementTable::getList( array (
//'order' => array('SORT' => 'ASC'), // сортировка
//'order' => array(),
'sel ect' => array ( 'ID' , 'NAME' , 'DATE_CREATE' , 'PREVIEW_TEXT' , 'PREVIEW_PICTURE' , 'IBLOCK_ID' , 'SORT' ), // выбираемые поля, без свойств. Свойства можно получать на старом ядре \CIBlockElement::getProperty
'filter' => array ( 'IBLOCK_ID' => $this ->arParams[ 'IBLOCK_ID' ]), // фильтр только по полям элемента, свойства (PROPERTY) использовать нельзя
'group' => array ( 'DATE_CREATE' ), // группировка по полю, order должен быть пустой
//'limit' => 1000, // целое число, ограничение выбираемого кол-ва
'offset' => 0 , // целое число, указывающее номер первого столбца в результате
'count_total' => 1 , // дает возможность получить кол-во элементов через метод getCount()
'runtime' => array (), // массив полей сущности, создающихся динамически
'data_doubling' => false , // разрешает получение нескольких одинаковых записей
'cache' => array ( // Кеш запроса. Сброс можно сделать методом \Bitrix\Iblock\ElementTable::getEntity()->cleanCache();
'ttl' => 3600 , // Время жизни кеша
'cache_joins' => true // Кешировать ли выборки с JOIN
),
));
$items = Array ();
while ( $arItem = $dbItems ->fetch()){
$db_props = CIBlockElement::GetProperty( $arItem [ 'IBLOCK_ID' ], $arItem [ 'ID' ]);
while ( $ar_props = $db_props ->Fetch()){
$props = $ar_props ;
}
$arItem [ 'PROPS' ] = $props ;
$items [] = $arItem ;
} [/CODE]
Но вот когда распечатываю $items у меня на выходе вот что:
[CODE] Array (
[ 0 ] => Array
(
[ID] => 320
[NAME] => Новость 1
[DATE_CREATE] => Bitrix\Main\Type\DateTime Object
(
[userTimeEnabled: protected ] => 1
[value: protected ] => DateTime Object
(
[date] => 2021 - 08 - 08 15 : 14 : 10.000000
[timezone_type] => 3
[timezone] => Europe/Moscow
)
)
[PREVIEW_TEXT] => Анонс новости 1
[PREVIEW_PICTURE] => 956
[IBLOCK_ID] => 4
[SORT] => 500
[PROPS] => Array
(
[ID] => 26
[TIMESTAMP_X] => 2022 - 08 - 08 16 : 54 : 12
[IBLOCK_ID] => 4
[NAME] => Произвольный текст
[ACTIVE] => Y
[SORT] => 500
[CODE] => CUSTOMTEXT
[DEFAULT_VALUE] =>
[PROPERTY_TYPE] => S
[ROW_COUNT] => 1
[COL_COUNT] => 30 [LIST_TYPE] => L
[MULTIPLE] => N
[XML_ID] =>
[FILE_TYPE] =>
[MULTIPLE_CNT] => 5
[TMP_ID] =>
[LINK_IBLOCK_ID] => 0
[WITH_DESCRIPTION] => N
[SEARCHABLE] => N
[FILTRABLE] => N
[IS_REQUIRED] => N
[VERSION] => 1
[USER_TYPE] =>
[USER_TYPE_SETTINGS] =>
[HINT] =>
[PROPERTY_VALUE_ID] => 2062
[VALUE] => Мой произвольный текст
[DESCRIPTION] =>
[VALUE_ENUM] =>
[VALUE_XML_ID] =>
[VALUE_SORT] =>
)
)
[ 1 ] => Array
(
[ID] => 321
[NAME] => Новость 2
[DATE_CREATE] => Bitrix\Main\Type\DateTime Object
(
[userTimeEnabled: protected ] => 1
[value: protected ] => DateTime Object
(
[date] => 2022 - 08 - 08 15 : 14 : 10.000000
[timezone_type] => 3
[timezone] => Europe/Moscow
)
)
[PREVIEW_TEXT] => Анонс новости 2
[PREVIEW_PICTURE] => 958
[IBLOCK_ID] => 4
[SORT] => 500
[PROPS] => Array
(
[ID] => 26
[TIMESTAMP_X] => 2022 - 08 - 08 16 : 54 : 12
[IBLOCK_ID] => 4
[NAME] => Произвольный текст
[ACTIVE] => Y
[SORT] => 500
[CODE] => CUSTOMTEXT
[DEFAULT_VALUE] =>
[PROPERTY_TYPE] => S
[ROW_COUNT] => 1
[COL_COUNT] => 30 [LIST_TYPE] => L
[MULTIPLE] => N
[XML_ID] =>
[FILE_TYPE] =>
[MULTIPLE_CNT] => 5
[TMP_ID] =>
[LINK_IBLOCK_ID] => 0
[WITH_DESCRIPTION] => N
[SEARCHABLE] => N
[FILTRABLE] => N
[IS_REQUIRED] => N
[VERSION] => 1
[USER_TYPE] =>
[USER_TYPE_SETTINGS] =>
[HINT] =>
[PROPERTY_VALUE_ID] =>
[VALUE] =>
[DESCRIPTION] =>
[VALUE_ENUM] =>
[VALUE_XML_ID] =>
[VALUE_SORT] =>
)
)
[ 2 ] => Array
(
[ID] => 322
[NAME] => Новость 3
[DATE_CREATE] => Bitrix\Main\Type\DateTime Object
(
[userTimeEnabled: protected ] => 1
[value: protected ] => DateTime Object
(
[date] => 2022 - 08 - 08 15 : 14 : 10.000000
[timezone_type] => 3
[timezone] => Europe/Moscow
)
)
[PREVIEW_TEXT] => Анонс новости 3
[PREVIEW_PICTURE] =>
[IBLOCK_ID] => 4
[SORT] => 500
[PROPS] => Array
(
[ID] => 26
[TIMESTAMP_X] => 2022 - 08 - 08 16 : 54 : 12
[IBLOCK_ID] => 4
[NAME] => Произвольный текст
[ACTIVE] => Y
[SORT] => 500
[CODE] => CUSTOMTEXT
[DEFAULT_VALUE] =>
[PROPERTY_TYPE] => S
[ROW_COUNT] => 1
[COL_COUNT] => 30 [LIST_TYPE] => L
[MULTIPLE] => N
[XML_ID] =>
[FILE_TYPE] =>
[MULTIPLE_CNT] => 5
[TMP_ID] =>
[LINK_IBLOCK_ID] => 0
[WITH_DESCRIPTION] => N
[SEARCHABLE] => N
[FILTRABLE] => N
[IS_REQUIRED] => N
[VERSION] => 1
[USER_TYPE] =>
[USER_TYPE_SETTINGS] =>
[HINT] =>
[PROPERTY_VALUE_ID] =>
[VALUE] =>
[DESCRIPTION] =>
[VALUE_ENUM] =>
[VALUE_XML_ID] =>
[VALUE_SORT] =>
)
)
) [/CODE]
То есть элементы то выбираются, но никакой группировки нет. Или я может что-то не понимаю. Подскажите пожалуйста, каким образом \Bitrix\Iblock\ElementTable::g etList делает группировку, и как я это могу увидеть?[/QUOTE]
Вы не правильно понимаете работу оператора GROUP BY. Ознакомиться лучше в SQL. Попробую в двух словах обьяснить. [URL=https://www.w3schools.com/mysql/mysql_groupby.asp#:~:text=The%20MySQL%20GROUP%20BY%20Statement,by%20one%20or%20more%20columns.]Ссылка[/URL].
В GROUP BY задаем поле по которому должны "схлопываться" записи. А в SELECT поля которые отличаются от тех что в GROUP BY должны быть агрегированы, при помощи агрегированных функций. Иначе "схлопывания" не будет.
Вот пример:[CODE]name rating author
one 2 oneA
two 3 oneA
one 6 twoA[/CODE]Если написать следующий код[CODE]select name, rating, author fr om table
group by name;[/CODE]Это работать не будет, т.к. MySQL схлопнет столбец name по значениям, то как работать с другими полями она не знает.
Покажу как это работает через агрегирующие функции:[CODE]sel ect name, sum(rating) as SUMMA fr om table
group by name;[/CODE]Результат будет следующим:[CODE]name SUMMA
one 8
two 3
[/CODE]