vlambda博客
学习文章列表

mysql中分组时将某个字段的值进行拼接

问题描述

我需要将main中ID相对应的商品查询出来,由于ID和商品是一对多的关系,一个ID可能对应多个商品,但我想把这多个商品用字符串拼接成一个,然后去映射到java实体类上。


一步步解决

我用了个左连接查询使得 main表,item表这两个个表关联了起来

mysql中分组时将某个字段的值进行拼接

mysql中分组时将某个字段的值进行拼接

这样虽然把ID和商品都对应上了,但是每条ID有多条记录,而我只想要一个ID把多个itme_name的值合并成一个字符串这样的数据。在经过思考以后,我突然想到了·group by 。

mysql中分组时将某个字段的值进行拼接

但是用了group by 这明显不是我想到的结果啊,name虽然只有一个了,但是它对应的商品也只有一个了,我想要多个商品名,那怎么办呢?是不是有个函数可以做字符串拼接呢?emmmmm,有了,group_concat。。。

看这样就可以了,但是商品名称中间我不想用“,”分割怎么办呢?

使用这个 REPLACE()就行了

group_concat用法

默认用法

select*,group_concat(tmp.itemName) from(  select mo.id as id , oi.item_name as itemName from main mo  left join item as oi on mo.id = oi.order_id where mo.gmt_create >= "2020-07-01 00:00:00" and "2020-08-01 00:00:00" >= mo.gmt_create and mo.company_id = 7) as tmp group by tmp.id

group_concat拼接时默认的分隔符是’,’ ,如果我们想改变这个分隔符可以这样做。

REPLACE(group_concat(vaccine_name),',','这里填写你所想换的分隔符')

比如我想把默认的换成;

select *,REPLACE(group_concat(tmp.itemName),',',';') as itemName from(  select mo.id as id, oi.item_name as itemName from main mo  left join item as oi on mo.id = oi.order_id where mo.gmt_create >= "2020-07-01 00:00:00" and "2020-08-01 00:00:00" >= mo.gmt_create and mo.company_id = 7) tmp group by tmp.id