mysql in concat_mysql中FIND_IN_SET()和GROUP_CONCAT()的使用

知识点:mysql中FIND_IN_SET和GROUP_CONCAT()的使用

(一) 场景:当我们使用mysql数据库,查询一张的数据,其中的一列存放的是是另一张表id用“,”拼接的字符串

如下图所示:

person表:

77d4940846d65953630656eeb061b18f.png

hobby表:

55276d3b56ea853cf7c2e5dd24acd240.png

我们前端页面想展示(把person表hobby一栏存放hobby表id字符串改成name连接的字符串):

4ccc4fd4c00e8acbcd9502362c3c85e8.png

(二) sql

这时我们可以使用mysql中的两个函数FIND_IN_SET()和GROUP_CONCAT()

sql如下:

SELECT p.id, p.`name`,GROUP_CONCAT(h.`name`) as hobby from  person p

LEFT JOIN hobby h ON FIND_IN_SET(h.id,p.hobby)

GROUP BY p.id

(三)那 mysql中FIND_IN_SET()和GROUP_CONCAT() 分别是什么意思呢?

(1)FIND_IN_SET()

语法:FIND_IN_SET(str,strlist)

定义: (1)如果字符串str在由N子链组成的字符串列表中,则返回值范围在1-N之间

如:select FIND_IN_SET('c','a,b,c,d') 返回值为 3

(2)如果str不在strlist中或者strlist为空字符串,则返回值为 0

如:select FIND_IN_SET('e','a,b,c,d') 返回值为 0

select FIND_IN_SET('e','') 返回值为 0

(3)如果任意一个参数为NULL,返回NULL

如:select FIND_IN_SET('e',NULL),返回值为NULL

使用:在下面表中,如果我们想查询人员爱好弹琴的所有人员的话,该怎么查询呢?

f1d3977e3585f051a4279e82a28e184f.png

我们可以这样写sql:

SELECT * from

(SELECT p.id, p.`name`,GROUP_CONCAT(h.`name`) as hobby from  person p

LEFT JOIN hobby h ON FIND_IN_SET(h.id,p.hobby)

GROUP BY p.id) person1

WHERE FIND_IN_SET("弹琴",hobby)

查询结果:

3b6fb2da389989f5701841f5cc05b616.png

补充使用 in的话,场景不适用

(2)GROUP_CONCAT()

语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc] [separator '分隔符'])

功能:将group by产生的同一分组中的值连接起来,返回一个字符串结果

例如 a.表 person1 数据如下:查询相同爱好的所有人的名字

2a03b656c9e49f43fee4a640d9ba5e6c.png

sql:

SELECT GROUP_CONCAT(name),hobby from person1 GROUP BY hobby

查询结果:

b465dee139e6dda078ea9e3967ba9903.png

b.查询相同爱好的人员的id,按照从大到小,用“_”拼接

sql:

SELECT GROUP_CONCAT(id order by id desc separator '_' ),hobby from person1GROUP BY hobby

查询结果:

0eff27a261a0f45801f0109baa2a1891.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值