今天我们来说一个MySQL查询的例子,比如有一个统计需求, 分组后的数据,我们知道只能使用聚合函数进行统计, 那如果要根据分组约定,将一系列的值合并到单个字段显示出来, 应该怎么写呢?
首先我们准备数据,有一个用户喜好表,记录了用户的喜好。比如这样:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
结果很多行数据:
shopping
fishing
coding
那么问题来了,如果需要的输出类似于
shopping, fishing, coding
一行展示就够了,不要多行展示,应该怎么写呢?或者说MySQL有没有这个能力处理呢?
当然是有的。MySQL贴心地给出了 GROUP_CONCAT 函数,用于使用分隔符连接多行字段的值。比如说按照 person_id 进行分组,然后第二列输出用户喜好,使用逗号分隔符:
SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ') AS all_hobbies FROM peoples_hobbies GROUP BY person_id;
当然了,peoples_hobbies 表完全有可能在 hobbies 字段有重复的值,我们也可以进行唯一性筛选。把上述SQL语句改造一下:
SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ') AS all_hobbies FROM peoples_hobbies GROUP BY person_id;
写到这里基本上已经可以满足使用了。可是我们还可以再进一步。比如对我们的输出字段进行排序后再使用分隔符连接。
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') AS all_hobbies FROM peoples_hobbies GROUP BY person_id;