今天看人家用group_concat,才感觉这里懂得有些少,学习一番。
一:concat基础函数
1.函数用法
语法:concat(str1, str2,...)
将多个字符串连接成一个字符串。
2.示例
select concat(contract_id, ' - ', bd_code, ' - ', bd_name) as tmp from t_plm_contract_monitor;
效果:
可以看到,这里是将每行的数据,所有的字段,进行相连。
3.注意点
如果一个字段是null,则返回这行都是一个null【网上说法】。
进行试验:
结果发现:
这一行不是空的null,试验出真知,没有的地方是不显示。
不知道是不是版本的问题。这个mysql版本是5.6.
二:concat_ws
1.说明
上面的写法感觉有点累啊,因为每个链接符都要写,是否有简单的方式的?
这个函数的使用方式如下:
concat_ws(separator, str1, str2, ...)
只要在第一个位置上,指定分隔符就不会出现问题。
2.试验
select concat_ws(' - ',contract_id,bd_code,bd_name) as tmp from t_plm_contract_monitor;
效果:
3.说明
感觉使用的使用是挺好的。
4.少数据会怎样呢?
试验效果如下,仍然是不显示。
三:group_concat
1.说明
这个是今天的重头戏。
2.举例
通过合同id进行分组,找到最小的id。
select contract_id, min(id) from t_plm_contract_monitor group by contract_id;
结果:
3.更加多的需求
上面的问题比较简单,但是我想知道一个contract_id对应的id有哪些呢,又不会出现多行contract_id一样的数据。
这个时候就可以使用这个函数了。
4.举例
select contract_id, GROUP_CONCAT(id) from t_plm_contract_monitor group by contract_id;
结果:
5.更加优化的用法
为啥这么说呢,因为上面的用法中,没有说明如何使用的分隔符。
group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
6.试验一下
让id进行倒叙,使用‘-’进行分割。
select contract_id, GROUP_CONCAT(distinct id order by id desc separator '-') from t_plm_contract_monitor group by contract_id;
结果:
7.还一种用法
select group_concat(mm.contract_id) from ( select contract_id from t_plm_contract_bill_term_monitor where is_deleted = 0 GROUP by bill_term_end_date,contract_id HAVING count(*) > 1 ) mm
结果: