MySQL Group数据类型与无group场景下group_concat行为疑问
关于你提到的group是否为数据类型的问题
这里手册中的group并不是某种可手动创建的数据类型,它指的是SQL中GROUP BY子句执行后,被划分到同一个分组里的行集合,是分组查询逻辑下的临时行集合,不存在对应的数据类型,也没法手动创建。
关于直接传常量返回onetwo的原因
出现这个现象是GROUP_CONCAT的两个特性共同作用的结果:
- 它是聚合函数,作用对象是分组后的行集合:如果查询没有加
GROUP BY子句,默认会把整个查询结果集当做同一个分组处理。你执行select group_concat('one', 'two');时没有查询任何表,整个结果集只有1行,所以整个分组就只有这1行数据。 GROUP_CONCAT支持传入多个表达式,同一行内的多个表达式会先做拼接,再把不同行的拼接结果用分隔符连接。你传入了两个常量'one'和'two',这两个值属于同一行,会先被拼接成onetwo,又因为分组里只有这一行,没有跨行的拼接逻辑,最终结果就和CONCAT('one', 'two')完全一致。
补充说明
如果你想要手动传入多个值得到CSV格式的拼接结果,可以构造多行虚拟数据集再调用GROUP_CONCAT,示例如下:
SELECT GROUP_CONCAT(val) FROM ( SELECT 'one' AS val UNION ALL SELECT 'two' AS val ) AS temp;
执行后返回结果就是one,two,符合你预期的CSV格式拼接效果。你之前写的select group_concat(column) from table group by column其实存在逻辑问题:按column字段分组后,每个分组里的column值都是相同的,不会同时出现one和two,正常要拼接全表的column值不需要加GROUP BY column。
内容的提问来源于stack exchange,提问作者user3783243
相关产品推荐
相关产品推荐

