@Snatch87
Битриксоид по принуждению

Как в ORM битрикса добавить distinct к запросу?

Всем привет!
Есть таблица, описанная в Entities\Marketing\PostingTmpTable
В ней хранятся промежуточные данные по рассылкам с сайта. В таблице около 500 000 записей. Собирается дополнительным скриптом.
Основное используемое поле EMAIL. По нему происходит связь с другими таблицами
есть hlBlockEntity - > хайлоад блок, с дополнительной информацией по подписчикам
\Bitrix\Sender\PostingRecipientTable - битриксовая таблица, с адресатами, кому какая отправка была (\Bitrix\Sender\PostingTable)
В таблице \Bitrix\Sender\PostingTable есть поле MAILING_ID - id группы рассылки, по которому делается фильтрация

Получается, примерно такой запрос:

$query  = (new \Bitrix\Main\Entity\Query(\Entities\Marketing\PostingTmpTable::getEntity()))

	 ->registerRuntimeField('PROPERTY', [
        'data_type' => $hlBlockEntity,
        'reference' => [
            '=this.EMAIL' => 'ref.UF_EMAIL'
        ]
    ])
    ->registerRuntimeField('RECIPIENT', [
        'data_type' => '\Bitrix\Sender\PostingRecipientTable',
        'reference' => [
            '=this.EMAIL' => 'ref.EMAIL',
        ],
    ])
    ->registerRuntimeField('POSTING', [
        'data_type' => '\Bitrix\Sender\PostingTable',
        'reference' => [
            '=this.RECIPIENT.POSTING_ID' => 'ref.ID',
        ]
    ])
    ->where('POSTING.MAILING_ID', 6)
    ->setSelect(/* сюда ставлю собираемый массив селектов, к делу не относится*/)
;


Проблема в том, что в таблице Bitrix\Sender\PostingRecipientTable 7 000 000 записей, и на каждый email адрес может быть множество записей
Из-за этого в результате, отбирая по POSTING.MAILING_ID = 6, я получаю результатом количество записей большее, чем в моей таблице Entities\Marketing\PostingTmpTable

Если воспользоваться методом $query->getQuery() и к полученному sql запросу добавить distinct, то результат становится верным.
Отсюда вопрос, как для объекта query добавить distinct?? в битриксовой документации ответа не нашел, в классе query тоже.

Есть \Bitrix\Main\Entity\Query::expr()->countDistinct("ID") - но это подходит, только для общего подсчета элементов, а в самом запросе я использую limit, для вывода ограниченного количества записей, но у меня получается много дублей, который быть не должно.

Надеюсь, что понятно изложил суть вопроса!
  • Вопрос задан
  • 5465 просмотров
Решения вопроса 1
serginhold
@serginhold
Вообще в документации есть expression field
https://dev.1c-bitrix.ru/learning/course/index.php...

new Entity\ExpressionField('DISTINCT_ID',
'DISTINCT %s', array('ID')
)

по идее это в select
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы