在表设计中,一个字段可能会对应多条数据,但在有的查询场景下,需要实现将多行数据合并成一行数据,在MySQL中可以使用GROUP_CONCAT函数来实现;GROUP_CONCAT函数会计算哪些行属于同一组,并将属于同一组的列显示出来,要返回哪些列,由函数参数(就是字段名)决定,此外分组必须有个标准,就是根据group by指定的列进行分组
例如:在权限设计中,一个角色ID(rid)会对应多个用户ID(uid),按照一般的SQL语句是这样的
SELECT
r.*,
u.uid
FROM
t_p2_role r
JOIN t_p2_user_role u
ON r.rid = u.rid
查询结果如下图:
如果需要查每个角色下有哪些用户,则SQL可按如下修改:
SELECT
r.*,
GROUP_CONCAT(u.uid SEPARATOR ',') uids
FROM
t_p2_role r
JOIN t_p2_user_role u
ON r.rid = u.rid
GROUP BY r.rid
查询结果如下图:
注:
1、GROUP_CONCAT()中的值为你要合并的数据的字段名;SEPARATOR函数是用来分隔这些要合并的数据;单引号中是指定的分隔符
2、GROUP_CONCAT()函数需要与group by语句一起使用,才能得到需要的效果,否则所有的数据都会被合并成一条记录,如下图:
其原因可以这样理解:经过GROUP_CONCAT()处理得到的是属于x组的所有成员(函数里面列参数指定需要显示哪些字段),那x组从哪里来?如果没有group by进行指定,那么GROUP_CONCAT()根本不知道要根据哪个分组进行显示成员
所以实际中假如需要查询的结果是这样:左边显示组名,右边显示该组别下的所有成员信息,用这个函数,可以省去很多事情