Как избавиться от дублей с: PlainIndex type = distributed + groupby()

Есть индекс products_category_236 c type = distributed который базируется на локальных PLAIN индексах products_category_239 products_category_241
Структура и состав показаны ниже:

MySQL [(none)]> select id, group_id from products_category_236;
+-------+----------+
| id    | group_id |
+-------+----------+
| 29117 |      267 |
| 29137 |      287 |
| 29138 |      288 |
+-------+----------+
3 rows in set (0.001 sec)
MySQL [(none)]> desc products_category_236;
+-----------------------+-------+
| Agent                 | Type  |
+-----------------------+-------+
| products_category_239 | local |
| products_category_241 | local |
+-----------------------+-------+
2 rows in set (0.000 sec)
MySQL [(none)]> select id, group_id from products_category_239;
+-------+----------+
| id    | group_id |
+-------+----------+
| 29117 |      267 |
| 29137 |      287 |
| 29138 |      288 |
+-------+----------+
3 rows in set (0.001 sec)
MySQL [(none)]> select id, group_id from products_category_241;
+-------+----------+
| id    | group_id |
+-------+----------+
| 29117 |      267 |
| 29137 |      287 |
| 29138 |      288 |
+-------+----------+
3 rows in set (0.001 sec)
MySQL [(none)]> desc products_category_239;
+-----------------------+--------+------------+
| Field                 | Type   | Properties |
+-----------------------+--------+------------+
| id                    | bigint |            |
| full_name             | text   | indexed    |
    .......
| i_float_mm            | json   |            |
+-----------------------+--------+------------+
36 rows in set (0.000 sec)
MySQL [(none)]> desc products_category_241;
+-----------------------+--------+------------+
| Field                 | Type   | Properties |
+-----------------------+--------+------------+
| id                    | bigint |            |
| full_name             | text   | indexed    |
    .......
| i_float_mm            | json   |            |
+-----------------------+--------+------------+
36 rows in set (0.000 sec)

Если выполнить группирующий запрос ниже, то мы получаем дубли товаров. Причём, эти дубли будут и в фасетах (при добавлении FACET ....)
Вопрос, можно ли как-то избавиться от дублей не убирая type = distributed у индекса?

MySQL [(none)]> select group_concat(`id`) as `ids`, groupby() as `group_id`  from `products_category_236` group by `group_id` ;
+-------------+----------+
| ids         | group_id |
+-------------+----------+
| 29117,29117 |      267 |
| 29137,29137 |      287 |
| 29138,29138 |      288 |
+-------------+----------+
3 rows in set (0.001 sec)

Дубли при работе с фасетами:

MySQL [(none)]> select id, group_id, brand_id from products_category_236;
+-------+----------+----------+
| id    | group_id | brand_id |
+-------+----------+----------+
| 29117 |      267 |      491 |
| 29137 |      287 |      491 |
| 29138 |      288 |      492 |
+-------+----------+----------+
3 rows in set (0.001 sec)

MySQL [(none)]> select group_concat(`id`) as `ids`, groupby() as `group_id`  from `products_category_236` group by `group_id` FACET brand_id; SHOW META;
+-------------+----------+
| ids         | group_id |
+-------------+----------+
| 29117,29117 |      267 |
| 29137,29137 |      287 |
| 29138,29138 |      288 |
+-------------+----------+
3 rows in set (0.002 sec)

+----------+----------+
| brand_id | count(*) |
+----------+----------+
|      491 |        4 |
|      492 |        2 |
+----------+----------+
2 rows in set (0.002 sec)

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| total         | 3     |
| total_found   | 3     |
| time          | 0.000 |
| multiplier    | 2     |
+---------------+-------+
mysql> select * from s1;
+-------+----------+------+
| id    | group_id | f    |
+-------+----------+------+
| 29117 |      267 |      |
| 29137 |      287 |      |
| 29138 |      288 |      |
| 30000 |      288 |      |
+-------+----------+------+
mysql> select * from s2;
+-------+----------+------+
| id    | group_id | f    |
+-------+----------+------+
| 29117 |      267 |      |
| 29137 |      287 |      |
| 29138 |      288 |      |
+-------+----------+------+
mysql> desc distr;
+-------+-------+
| Agent | Type  |
+-------+-------+
| s1    | local |
| s2    | local |
+-------+-------+
mysql> select group_id, id, count(*) from distr group by group_id, id;
+----------+-------+----------+
| group_id | id    | count(*) |
+----------+-------+----------+
|      267 | 29117 |        2 |
|      287 | 29137 |        2 |
|      288 | 29138 |        2 |
|      288 | 30000 |        1 |
+----------+-------+----------+

не подойдёт? А group_concat() реализовывать уже в приложении.

К сожалению не подойдёт, т.к. важна пагинация. В вашем варианте, если представить, что в одной группе может быть 20 товаров, то они все попадут в выборку и “забьют” всю страницу вывода (

Через UDF должно быть возможно.

Не очень понятно как, ведь там и сами фасеты тоже глючат и показывают неправильное кол-во.

вы можете написать UDF expression который будет принимать значения - накапливать и сортировать как вы хотите и выдавать строчку, типа

select my_grcat(`id`) as `ids`, groupby() as `group_id`  from `products_category_236` group by `group_id` ;

примеры создания UDF есть в udfexample и plugins

или заведите issue на Github - где будуту задавать непоянтные вам вопросы по написанию UDF