在开发中我们很多的时候都存在这样的问题。将表的几列合并到一行显示。
例如
ID | NAME | SUBJECT |
1 | 小王 | 语文 |
2 | 小王 | 语文 |
3 | 小张 | 数学 |
4 | 小王 | 英语 |
我们想查询每个人有哪些课程 显示方式如
小王 | 语文,英文,语文 |
小明 | 语文 |
可能以前对于大部分人来说,先查询NAME,然后再分别由名称查询COURSE【我以前也是这样做的】。
其实对于mysql数据库都支持将列合并到一行显示,即group_concat 函数,
group_concat 必须与 group by 一起使用
完整句法如下:
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col ...]] [SEPARATOR str_val])
可以看到我们在group_concat 函数中可以使用distinct,order by等以前使用
而separator则是显示使用什么样的链接字符。
对于以上查询我们可以
select name, GROUP_CONCAT( `subject` separator ',' ) from test group by name
如果里面出现小王有两条语文课的记录我们连接只想查询这样的结果呢
小王 |
语文,英文 |
小明 |
语文 |
我们可以使用distinct的函数 使用方法如下。
select name, GROUP_CONCAT( distinct test.`subject` separator ',' ) from test group by test.`name`
如果我们想按课程排序呢,我们可以使用order by
select name, GROUP_CONCAT( distinct test.`subject` order by subject separator ',' ) from test group by test.`name`
注意的事对于group_concat函数来说默认是有连接字符长度的限制。
它有系统变量group_concat_max_len限制,默认长度只有1024
如果超出1024将会被截取掉。
怎么样增大group_concat_max_len 的大小。
SET [GLOBAL | SESSION] group_concat_max_len = val;
GLOBAL设置全局group_concat_max_len,数据库不重启一直有效。
SESSION设置当前会话group_concat_max_len,会话结束失效。
val设置的长度,自定义
SET SESSION group_concat_max_len=102400;