mysql group_concat的用法及注意点

group_concat的默认分隔符是“,”,若要改为其他分隔符,则使用SEPARATOR来指定,
例如:

mysql> SELECT student_id, GROUP_CONCAT(courses_id SEPARATOR '@#$') AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;

除此之外,还可以对这个组的值来进行排序再连接成字符串,例如按courses_id降序来排:

mysql> SELECT student_id, GROUP_CONCAT(courses_id ORDER BY courses_id DESC) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;

1.int字段的连接陷阱

当你用group_concat的时候请注意,连接起来的字段如果是int型,一定要转换成char再拼起来, 否则在你执行后(ExecuteScalar或者其它任何执行SQL返回结果的方法)返回的将不是一个逗号隔开的串, 而是byte[]。 该问题当你在SQLyog等一些工具中是体现不出来的,所以很难发现。

select group_concat(ipaddress) from t_ip 返回逗号隔开的串
select group_concat(id) from t_ip 返回byte[]
select group_concat(CAST(id as char)) from t_dep 返回逗号隔开的串
select group_concat(Convert(id , char)) from t_dep 返回逗号隔开的串

附Cast,convert的用法:
CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name)
CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值。 这个类型 可以是以下值其中的 一个: BINARY[(N)] CHAR[(N)] DATE DATETIME DECIMAL SIGNED [INTEGER] TIME UNSIGNED [INTEGER]

2.长度陷阱

用group_concat连接字段的时候是有长度限制的,并不是有多少连多少。但你可以设置一下。
使用group_concat_max_len系统变量,你可以设置允许的最大长度。
程序中进行这项操作的语法如下,其中 val 是一个无符号整数: SET [SESSION | GLOBAL] group_concat_max_len = val;
若已经设置了最大长度, 则结果被截至这个最大长度。 在SQLyog中执行 SET GLOBAL group_concat_max_len = 10 后,
重新打开SQLyog,设置就会生效。

工作中用到的分隔符的例子:

SELECT GROUP_CONCAT(tu.user_id) AS memberIds,GROUP_CONCAT(u.`user_name`) AS memberNames,GROUP_CONCAT("【",d.dept_name,"】",u.user_name SEPARATOR "、") AS memberDeptName,
		SUM(tu.`read_flag`) AS readNums,
		(COUNT(*)-SUM(tu.`read_flag`)) AS unreadNums,
		SUM(tu.`finish_flag`) AS finishNums,
		(COUNT(*)-SUM(tu.`finish_flag`)) AS unfinishNums 
		FROM hbk_task_user tu 
		INNER JOIN sys_user u ON tu.user_id=u.`user_id` 
		INNER JOIN sys_dept d ON u.`dept_id`=d.dept_id
		WHERE tu.task_id= 59 GROUP BY tu.task_id;

内容转自 https://blog.csdn.net/qq_33323054/article/details/82696849

你可能感兴趣的:(mysql)