解决leftJoin之后的多⾏数据变成⼀⾏,将特定字段添加到⼀⾏以“,”隔开的sql语
blog.csdn/qq_16605855/article/details/76637925
1、Oracle函数 WMSYS.WM_CONCAT的使⽤
如图,将图1的结果变成图2的结果,使⽤函数 WMSYS.WM_CONCAT 即可。
查询语句需要配合使⽤group by
select aa,wmsys.wm_concat(t1.name) from (
select t.name,to_atedate,‘yyyy-mm-dd’) aa from td_user t where t.td_conference_id = 3218 and t.status = 1 atedate > to_date(‘2012-10-28’,‘yyyy-mm-dd’) order by createdate desc
) t1 group by t1.aa
图1:
图2:
2、MySQL 函数 GROUP_CONCAT 的使⽤
GROUP_CONCAT()是mysql数据库提供的⼀个函数,通常跟GROUPBY⼀起⽤,具体可参考MySQL官⽅⽂
挡:sql/doc/refman/5.0/en/group-by-functions.html#function_group-concat。
完整的语法如下:
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])
基本查询
mysql> select * from aa;
±-----±-----+
| id| name |
±-----±-----+
|1 | 10|
|1 | 20|
|1 | 20|
|2 | 20|
|3 | 200 |
|3 | 500 |
±-----±-----+
6 rows in set (0.00 sec)
以id分组,把name字段的值打印在⼀⾏,逗号分隔(默认)
mysql> select id,group_concat(name) from aa group by id;
±-----±-------------------+
| id| group_concat(name) |
±-----±-------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
±-----±-------------------+
3 rows in set (0.00 sec)
以id分组,把name字段的值打印在⼀⾏,分号分隔
mysql> select id,group_concat(name separator ‘;’) from aa group by id;±-----±---------------------------------+
| id| group_concat(name separator ‘;’) |
±-----±---------------------------------+
|1 | 10;20;20 |
|2 | 20|
|3 | 200;500 |
±-----±---------------------------------+
3 rows in set (0.00 sec)
以id分组,把去冗余的name字段的值打印在⼀⾏,
逗号分隔
mysql> select id,group_concat(distinct name) from aa group by id;
±-----±----------------------------+
| id| group_concat(distinct name) |
±-----±----------------------------+
|1 | 10,20|
|2 | 20 |
|3 | 200,500 |
±-----±----------------------------+
3 rows in set (0.00 sec)
以id分组,把name字段的值打印在⼀⾏,逗号分隔,以name排倒序
mysql> select id,group_concat(name order by name desc) from aa group by id;
±-----±--------------------------------------+
| id| group_concat(name order by name desc) |
±-----±--------------------------------------+
|1 | 20,20,10 |
|2 | 20|
|3 | 500,200|
±-----±--------------------------------------+
3 rows in set (0.00 sec)
需要注意的:
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返回逗号隔开的串sql left join 多表连接
select group_concat(Convert(id , char)) from t_dep返回逗号隔开的串
附Cast,convert的⽤法:
CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USINGtranscoding_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,设置就会⽣效。

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