Имея запрос вида (пример запроса показан ниже), можно ли как-то сортировать внутри сгруппированных значений? Например как это сделано в MySQL
Чтобы 29216 и 28964 поменялись местами.
MySQL [(none)]> select group_concat(id) as `ids`, groupby() as `group_id` from products_type_1134 where group_id = 114 group by `group_id`;
+-------------+----------+
| ids | group_id |
+-------------+----------+
| 28964,29216 | 114 |
+-------------+----------+
1 row in set (0.001 sec)
Именно через group_concat() нельзя. Но можно через GROUP N BY и WITHIN GROUP ORDER BY :
snikolaev@dev:~$ docker run --name manticore --rm -d manticoresearch/manticore && docker exec -it manticore mysql && docker stop manticore
1277f54736f7d9b708d9ff5f3a0961cb37a8e2641059f3758c9eb860758ee878
mysql> create table t(f text, group_id int);
mysql> insert into t values(28964,'a',114);
mysql> insert into t values(29216,'a',114);
mysql> select id, groupby() as `group_id` from t where group_id = 114 group 2 by `group_id` within group order by id asc;
+-------+----------+
| id | group_id |
+-------+----------+
| 28964 | 114 |
| 29216 | 114 |
+-------+----------+
mysql> select id, groupby() as `group_id` from t where group_id = 114 group 2 by `group_id` within group order by id desc;
+-------+----------+
| id | group_id |
+-------+----------+
| 29216 | 114 |
| 28964 | 114 |
+-------+----------+
На group_concat()WITHIN GROUP ORDER BY, к сожалению, не действует:
mysql> select group_concat(id) as `ids`, groupby() as `group_id` from t where group_id = 114 group by `group_id` within group order by id asc;
+-------------+----------+
| ids | group_id |
+-------------+----------+
| 29216,28964 | 114 |
+-------------+----------+
mysql> select group_concat(id) as `ids`, groupby() as `group_id` from t where group_id = 114 group by `group_id` within group order by id desc;
+-------------+----------+
| ids | group_id |
+-------------+----------+
| 29216,28964 | 114 |
+-------------+----------+
Хотя теоретически это было бы полезно в плане функционала (либо же сделать отдельный ORDER BY, как в MySQL), но пока такого функционала нет.
Действует, но немного не так, как ожидается вами. Пример:
MySQL [(none)]> select group_concat(`id`) as `ids`, groupby() as `group_id`, similar.28963 as similar_order from `products_type_1134` where (`similar_order` is not null) group by `group_id` within group order by similar.28963 asc order by `similar_order` asc limit 2; select group_concat(`id`) as `ids`, groupby() as `group_id`, similar.28963 as similar_order from `products_type_1134` where (`similar_order` is not null) group by `group_id` within group order by similar.28963 desc order by `similar_order` asc limit 2;
+-------------+----------+---------------+
| ids | group_id | similar_order |
+-------------+----------+---------------+
| 28964,29216 | 114 | 0000 |
| 28955 | 105 | 0002 |
+-------------+----------+---------------+
2 rows in set (0.002 sec)
+-------------+----------+---------------+
| ids | group_id | similar_order |
+-------------+----------+---------------+
| 28964,29216 | 114 | 0001 |
| 28955 | 105 | 0002 |
+-------------+----------+---------------+
2 rows in set (0.001 sec)
MySQL [(none)]> select id, similar.28963 from products_type_1134 where id in (28964,29216);
+-------+---------------+
| id | similar.28963 |
+-------+---------------+
| 28964 | 0001 |
| 29216 | 0000 |
+-------+---------------+
Обратите внимание на результат колонки similar_order для группы 114 - он разный.
Очень полезная опция, если была бы сортировка для GROUP_CONCAT().
Как это сделано для MySQL GROUP_CONCAT ( [DISTINCT] col_name1 [ORDER BY clause] [SEPARATOR str_val] )
К примеру, такой запрос ниже не сортирует значения для GROUP_CONCAT с учётом WEIGHT()
SELECT GROUP_CONCAT(product_id) as id_list
FROM my_index
WHERE MATCH('@search *search_key*')
ORDER BY WEIGHT() DESC
Для решения задачи получается необходимо отказаться от GROUP_CONCAT() и перебирать все записи из запроса для эмуляции функции GROUP_CONCAT(), чтобы получить список значений в нужном порядке.
Рассмотрите пожалуйста добавление такого функционала, спасибо.