MySQL 一个字段,用','隔开,存储多个id,关联查询

MySQL 一个字段,用’,'隔开,存储多个id,关联查询

因为朋友过来问我,一个商品表的一个颜色的关联字段,里面放着多个颜色的id,这些id用逗号隔开,然后想要查出一条商品记录上显示出所有颜色。实现效果如下:

商品表:goods

select * from goods;
idnamecolor
1中性笔2,3,4
2圆珠笔1,3

颜色表:color

select *  from color;
idname
1红色
2白色
3黑色
4蓝色

查询后的结果:

select g.id as id,g.name as name,GROUP_CONCAT(c.color_name) as color_name from goods g
inner join color c on FIND_IN_SET(c.id,g.color)
group by g.id;
idnamecolor_name
1中性笔白色,黑色,蓝色
2圆珠笔红色,黑色

这里面涉及到两个函数,GROUP_CONCATFIND_IN_SET

1、GROUP_CONCAT

官方文档:https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat
帖子详解:https://baijiahao.baidu.com/s?id=1595349117525189591&wfr=spider&for=pc

2、FIND_IN_SET

官方文档:https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_find-in-set

示例:

SELECT FIND_IN_SET(  'b' , 'a,b,c,d' );  --返回值为2,即第2个值

语法:FIND_IN_SET(str,strlist)

定义:

  1. 假如字符串str在由N子链组成的字符串列表strlist中,则返回值的范围在1到N之间。

  2. 一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。

  3. 如果第一个参数是一个常数字符串,而第二个是typeSET列,则FIND_IN_SET()函数被优化,使用比特计算。

  4. 如果str不在strlist或strlist为空字符串,则返回值为0。

  5. 如任意一个参数为NULL,则返回值为NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。

strlist:一个由英文逗号“,”链接的字符串,例如:“a,b,c,d”,该字符串形式上类似于SET类型的值被逗号给链接起来。

速度方面的话,IN > FIND_IN_SET,具体文档可参照关于 find_in_set的性能问题,不过在表数据量不大的情况,为了节省表数量,可以使用该方式

  • 19
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值