欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql 连表分组 多个字段用逗号隔开

程序员文章站 2024-03-23 20:35:58
...

 例

SELECT *, GROUP_CONCAT(plate_tag.plate_id) FROM `tag` left join plate_tag ON plate_tag.tag_id = tag.id WHERE `tag`.`deleted_at` IS NULL AND `plate_tag`.`deleted_at` IS NULL GROUP BY tag.id;

mysql 连表分组 多个字段用逗号隔开

 

更多

转自:https://blog.csdn.net/liangfeng366/article/details/84092275,仅做个人备份,浏览请看原文)

GROUP_CONCAT()是MySQL数据库提供的一个函数,通常跟GROUP BY一起用,并把查询的字段逗号分隔开,只支持字符类型的字段,整数型须要特殊写法。

下面是一些使用注意事项:

1.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]

2.长度陷阱
用group_concat连接字段的时候是有长度限制的,并不是有多少连多少。但你可以设置一下。

使用group_concat_max_len系统变量,你可以设置允许的最大长度。
程序中进行这项操作的语法如下,其中 val 是一个无符号整数:
SET [SESSION | GLOBAL] group_concat_max_len = val;
若已经设置了最大长度, 则结果被截至这个最大长度。

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

请注意,这种方式只是临时的,如要长久的修改,则需要修改mysql的配置节。

到my.cnf的mysqld节点下加上group_concat_max_len =99999……

重启mysql。

上一篇: Java基础--流程控制

下一篇: