mysql-group_concat函数,将多⾏记录合并为⼀⾏前景: 今天做⼀个需求 把A表的ip字段数据更新到B表⾥⾯的ip字段;
A表是如果有两个IP地址就存⼊的是两条记录,例如:(id  ip )111  10.1.1.1            111 10.1.1.2
B表是如果有两个IP地址存的是⼀条记录且⽤","分隔开;例如: (id  ip )111  10.1.1.1,10.1.1.2
涉及:⾸先要把A表的两条记录合并为⼀条,且⽤","隔开,然后直接更新到B表
要⽤到mysql的group_concat函数,也会讲解concat()、concat_ws()函数的运⽤
语法:
group_concat这个函数能将相同的⾏组合起来,完整的语法如下:
group_concat([distinct] 要连接的字段 [order by asc/desc排序字段] [separator'分隔符'])
例⼦:
先查询A表的数据:
基本查询运⽤:和⾥⾯的distinct、order by 、separator的运⽤
select group_concat(ip) from test_host_ip
结果:我们发现并不是我们想要的结果,因为没有分组,所以他是把所有数据的ip字段都合并在⼀起了
select group_concat(ip),id from test_host_ip group by id
结果:加了group by之后得到了我们想要的结果,所以⼤家⽤的时候千万不⽤忘记你要根据哪个字段进⾏合并(记得group by 奥)!OK!
select group_concat(ip separator ':'),id from test_host_ip group by id
结果:我们发现结果就变成了⽤‘ :’来分隔了
4. group_concat(字段 order by 字段 asc/desc )
select id, group_concat(ip order by ip desc separator ':') from test_host_ip group by id
结果:我们发现ip的顺序已经变了,且是⽤‘:’分隔
select id, group_concat( distinct ip  order by ip desc separator '/') from test_host_ip group by id
结果:会去掉重复的ip,并以'/'分隔,ip 排序,如果只想去重,不想排序,去掉后⾯的order by就⾏,看⾃⼰实际的运⽤
补充:
contact() 函数:将多个字符串连接成⼀个字符串。mysql删除重复的数据保留一条
concat(字段, 字段2,...)
例⼦:
select concat(id,ip) as ip from test_host_ip
结果:把id与ip字段拼接成了⼀个字符串
concat_ws()-concat with separator函数:与concat相⽐,可以指定分隔符号
concat_ws(separator, 字段1, 字段2, ...)
例⼦:
select concat_ws(',',id,ip) as ip from test_host_ip
结果:把id与ip拼接,并以','隔开(可以⾃定义设置)
end :给⼤家贴⼀下最后的sql,亲测,⽆问题:
u pdate test_host h inner join (select id, group_concat(ip) as ip from test_host_ip group by id) i on i.id = h.id  set h.ip = i.ip

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