MySQL中好用的GROUP_CONCAT函数

今天看到同事的代码,又学到了一个有用的函数,刚看的时候不太懂,就搜了下用法,看下面这篇文章讲的挺详细就直接转载了,我也写不那么好,呵呵,感谢作者的无私奉献。

http://blog.sina.com.cn/s/blog_4e808acf01009qna.html  作者:miky

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,设置就会生效。

时间: 2024-11-05 16:00:50

MySQL中好用的GROUP_CONCAT函数的相关文章

MySQL中的内置系统函数

MySQL中的内置系统函数 用在SELECCT语句, 能及子句 where order by having 中 UPDATE DELETE, 函数中可以将字段名作为变量来用,变量的值就是这个列对应的每一行记录 一.字符串函数 php中用的函数,MySQl中大部也提供 1. CONCAT(S1,S2....SN): 把传入的参数连接成一个字符串 2. INSERT(str, x, y, insert): 将字符串X位置开始,y个字符串长度替换为字符串insert 3. LOWER(str) UPP

mysql中返回当前时间的函数或者常量

引用:http://blog.sina.com.cn/s/blog_6d39dc6f0100m7eo.html 1.1 获得当前日期+时间(date + time)函数:now() 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数: current_timestamp()   current_timestamp localtime()   localtime localtimestamp()   localtimestamp     这些日期时间函数,都等同于 now(

MYSQL中关于日期处理的函数

< DOCTYPE HTML PUBLIC -WCDTD HTML TransitionalEN> MySQL数据库中SQL语句中 关于日期.时间\时间戳的函数 一 MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now() mysql> select now(); +―――――――+| now() |+―――――――+| 2008-08-08 22:20:46 |+―――――――+除了 now() 函数能获得当前的日期时间外,MySQL 中

mysql中的count()函数使用

有时候总认为count(*)会比count(1)或者count(column name)慢,事实上是分情况处理. 比如: ---初始化语句 建立一张表并插入数据: create table test2 (id BIGINT PRIMARY key, name varchar(24))ENGINE=INNODB; insert into test2(id,name)values(1,null); insert into test2(id,name)values(2,'name1'); insert

mysql中几个有用的函数

1. FROM_UNIXTIME 作用:将MYSQL中以INT(11)存储的时间以"YYYY-MM-DD"格式来显示. 例: select mtime, from_unixtime(mtime) from topics limit 10; 2. CONCAT(str1,str2,-) 作用:将str1, str2...连接为字串.如有任何一个参数为NULL ,则返回值为 NULL. 例: update video set playlink = concat(playlink, '&am

MySQL巧用FIND_IN_SET和GROUP_CONCAT函数减少Java代码量

数据库表简介:物品表 `id` int(11)  '物品id,唯一标识', `name` varchar(255) '物品名称', `level` int(11) '物品类别等级,礼品包为最高级1,类别为2级,详细物品为3级', `parentId` int(11) '只有3级详细物品有上级id', `childIds` varchar(255)  '只有1级礼品包级有包含所有3级物品id的字符串,id之间用","隔开', 问题描述:利用sql语句简化代码,让Java代码可以直接通过j

MySQL中默认值中用时间函数的问题

今天在上课的时候在测试MSSQL建表的时候 注册时间默认值用getdate()可以获取插入值时候的时间create table temp( id int PRIMARY key, in_time datetime NOT NULL default getdate() ) 但是在MYSQL建表练习的时候不能用now()进行对应的做法: create table temp(    id int PRIMARY key,    in_time datetime NOT NULL default now

MySQL中的两个时间函数,用来做两个时间之间的对比

TIMESTAMPDIFF,(如果当期时间和之前时间的分钟数相比较.大于1天,即等于1:小于1天,则等于0) select TIMESTAMPDIFF(DAY,'2016-11-16 10:13:42',NOW()); DATEDIFF,(只按2016-11-16计算,不会加小时分钟数,按天计算) select DATEDIFF(NOW(),'2016-11-16 17:10:52'); 在SQL Server中,DATEDIFF要比MySQL强大,但是我不没用过. 来自为知笔记(Wiz)

mysql 中 unix_timestamp,from_unixtime 时间戳函数

1.unix_timestamp 将时间转化为时间戳.(date 类型数据转换成 timestamp 形式整数) 没传时间参数则取当前时间的时间戳 mysql> select unix_timestamp();+------------------+| unix_timestamp() |+------------------+|       1361586358 |+------------------+1 row in set (0.01 sec) mysql> select unix_t