Есть ли у SQL способ сгруппировать строки, не разбивая группу на одну строку? - PullRequest
0 голосов
/ 04 мая 2020

Я хочу сделать один запрос, который выводит массив массивов строк таблицы. Думайте в духе <table><rowgroup><tr><tr><tr><rowgroup><tr><tr>. SQL способен на это? (в частности, как это реализовано в MariaDB, хотя переход на AWS RDS может произойти однажды)
Один оператор GROUP BY этого не делает, он создает по одной строке на группу.

Вот пример о том, о чем я думаю ...

SELECT * FROM memes;

+------------+----------+
| file_name  | file_ext |
+------------+----------+
| kittens    | jpeg     |
| puppies    | gif      |
| cats       | jpeg     |
| doggos     | mp4      |
| horses     | gif      |
| chickens   | gif      |
| ducks      | jpeg     |
+------------+----------+

SELECT * FROM memes GROUP BY file_ext WITHOUT COLLAPSING GROUPS;

+------------+----------+
| file_name  | file_ext |
+------------+----------+
| kittens    | jpeg     |
| cats       | jpeg     |
| ducks      | jpeg     |
+------------+----------+
| puppies    | gif      |
| horses     | gif      |
| chickens   | gif      |
+------------+----------+
| doggos     | mp4      |
+------------+----------+

Я использую MySQL в течение ~ 20 лет и раньше не сталкивался с этой функцией, но, возможно, я просто искал не в том месте ¯\_(ツ)_/¯

1 Ответ

1 голос
/ 07 мая 2020

Я не видел рендеринга массива, такого как тот, который вам нужен, но вы можете смоделировать его с помощью нескольких предложений GROUP BY / GROUP_CONCAT().

Например:

select concat('[', group_concat(g), ']') as a
from (
  select concat('[', group_concat(file_name), ']') as g
  from memes
  group by file_ext
) x

Результат:

a                   
---------------------------------------------------------
[[puppies,horses,chickens],[kittens,cats,ducks],[doggos]]

См. Пример работы на DB Fiddle .

Вы можете настроить разделители, такие как ,, [ и ].

...