MySql GROUP_CONCAT() 使用

avatar
作者
筋斗云
阅读量:17

GROUP_CONCAT()是 MySQL 数据库提供的一个函数,通常跟 GROUP BY 一起用,具体可参考 MySQL 官方文挡:#function_group-concat。

GROUP_CONCAT()是 MySQL 数据库提供的一个函数,通常跟 GROUP BY 一起用,具体可参考 MySQL 官方文挡:#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() 函数可用来获取一个类型的值,并产生另一个类型的值。

这个类型 可以是以下值其中的 一个:

b.长度陷阱 用了 group_concat 后,select 里如果使用了 limit 是不起作用的. 用 group_concat 连接字段的时候是有长度限制的,并不是有多少连多少。但你可以设置一下。

程序中进行这项操作的语法如下,其中 val 是一个无符号整数:

SET [SESSION | GLOBAL] group_concat_max_len = val;

使用group_concat_max_len系统变量,你可以设置允许的最大长度。程序中进行这项操作的语法如下,其中 val 是一个无符号整数:

SET [SESSION | GLOBAL] group_concat_max_len = val;

若已经设置了最大长度,则结果被截至这个最大长度。

在 SQLyog 中执行SET GLOBAL group_concat_max_len = 10后,重新打开 SQLyog,设置就会生效。

Mysql IFNULL 和 IF 用法

Mysql SQL 语句中很多出现 IFNULL 和 IF 的处理,这 2 个函数的如何使用和有什么区别?

IFNULL(expr1,expr2),如果 expr1 不是 NULL,IFNULL()返回 expr1,否则它返回 expr2。

IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。

mysql> select IFNULL(1,0); -> 1
mysql> select IFNULL(0,10); -> 0
mysql> select IFNULL(1/0,10); -> 10
mysql> select IFNULL(1/0,’yes’); -> ‘yes’

IF(expr1,expr2,expr3)如果 expr1 是 TRUE(expr10 且 expr1NULL),那么 IF()返回 expr2,否则它返回 expr3。IF()返回一个数字或字符串值,取决于它被使用的上下文。

mysql> select IF(1>2,2,3); -> 3
mysql> select IF(1<2,’yes’,’no’); -> ‘yes’
mysql> select IF(strcmp(‘test’,’test1′),’yes’,’no’); -> ‘no'

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!