mysqlgroupby字符串拼接_MySQL之GROUP_CONCAT()
函数——将查询。。。
语法:
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC |DESC] [,col_name ...]] [SEPARATOR str_val])
+------------+---------+
| student_id | courses |
+------------+---------+
| 2  | 3
| 2  | 4
| 2  | 5+------------+---------+
1.例如: SELECT student_id, GROUP_CONCAT(courses_id) AS
courses FROM student_courses WHERE student_id=2GROUP 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_coursesWHERE 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 FROMstudent_courses WHERE student_id=2 GROUP BY student_id;
+------------+---------+
| student_id | courses |
+------------+---------+
| 2  | 5,4,3 |
+------------+---------+
4.需要注意的:
a.int字段的连接陷阱
当你⽤group_concat的时候请注意,连接起来的字段如果是int型,⼀定要转换成char再拼起来,
groupby是什么函数否则在你执⾏后(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,设置就会⽣效。转载时请注明出处及相应链接,本⽂永久地址:blog.yayuanzi/169.html
打赏
⽀付宝打赏
感谢您对作者terry的打赏,我们会更加努⼒!    如果您想成为作者,请点我

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。