concat
有的时候,我们有需要将由不同栏位获得的资料串连在一起。每一种资料库都有提供方法来达到这个目的:
mysql: concat()
oracle: concat(), ||
sql server: +
concat() 的语法如下:
concat(字串1, 字串2, 字串3, ...): 将字串1、字串2、字串3,等字串连在一起。
请注意,oracle的concat()只允许两个参数;
换言之,一次只能将两个字串串连起来。不过,在oracle中,我们可以用'||'来一次串连多个字串。
来看几个例子。假设我们有以下的表格:
geography 表格
region_name store_name
east boston
east new york
west los angeles
west san diego
例子1:
mysql/oracle:
select concat(region_name,store_name) from geography
where store_name = 'boston';
结果:
'eastboston'
例子2:
oracle:
select region_name || ' ' || store_name from geography
where store_name = 'boston';
结果:
'east boston'
例子3:
sql server:
select region_name + ' ' + store_name from geography
where store_name = 'boston';
结果:
'east boston'
group_concat
group_concat()是mysql数据库提供的一个函数,通常跟group by一起用,具体可参考mysql官方文挡:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat。
语法:
group_concat([distinct] expr [,expr ...]
[order by {unsigned_integer | col_name | expr}
[asc | desc] [,col_name ...]]
[separator str_val])
1.例如:
select student_id, group_concat(courses_id) as courses from student_courses where student_id=2 group by student_id;
+------------+---------+
| student_id | courses |
+------------+---------+
| 2 | 3,4,5 |
+------------+---------+
这 就不需要用php循环了
$row = $pdo->query(select student_id, group_concat(courses_id) as courses from student_courses where student_id=2 group by student_id);
$result = explode(',', $row['courses']);
2.当然分隔符还可以自定义,默认是以“,”作为分隔符,若要改为“|||”,则使用separator来指定,例如:
select student_id, group_concat(courses_id separator '|||') as courses from student_courses where student_id=2 group by student_id;
+------------+---------+
| student_id | courses |
+------------+---------+
| 2 | 3|||4|||5 |
+------------+---------+
3.除此之外,还可以对这个组的值来进行排序再连接成字符串,例如按courses_id降序来排:
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;
+------------+---------+
| student_id | courses |
+------------+---------+
| 2 | 5,4,3 |
+------------+---------+
4.需要注意的:
a.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]
b.长度陷阱
用了group_concat后,select里如果使用了limit是不起作用的.
用group_concat连接字段的时候是有长度限制的,并不是有多少连多少。但你可以设置一下。
使用group_concat_max_len系统变量,你可以设置允许的最大长度。
程序中进行这项操作的语法如下,其中 val 是一个无符号整数:
set [session | global] group_concat_max_len = val;
若已经设置了最大长度, 则结果被截至这个最大长度。
在sqlyog中执行 set global group_concat_max_len = 10 后,重新打开sqlyog,设置就会生效。