SQL是否有一种方法可以将行分组而不将组压缩为一行



我想做一个单一的查询,输出一个表行数组。按照<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年了,以前没有遇到过这个功能,但也许我只是找错了¯_(ツ)_/¯

我还没有看到像您想要的那样的数组呈现,但您可以用多个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上的运行示例。

可以调整分隔符,如,[]

SELECT ... ORDER BY file_ext将接近您的第二个输出。

使用GROUP BY ... WITH ROLLUP可以让你在每组下进行小计,这也不是你想要的,但它会在你想要休息的地方给你额外的行。

最新更新