Всем привет!
Есть таблица, описанная в 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, для вывода ограниченного количества записей, но у меня получается много дублей, который быть не должно.
Надеюсь, что понятно изложил суть вопроса!