SQL基础--(GROUP_CONCAT, FIND_IN_SET)

先建两张表,如下
material是材料表,attr是材料的属性表,material的ID与attr的MATERIAL_ID关联,是一对多的关系,表示一种材料可以有多个属性

  • material(材料表)

在这里插入图片描述

  • attr(材料属性表)

在这里插入图片描述
函数GROUP_CONCAT

GROUP_CONCAT:将查询到的多行数据连接成一行,返回一个字符串结果集,中间用’,’分割。

  • 情景1
    查询所有的材料名称返回成一个字符串进行展示,如果使用常规写法还需要在后台进行数据循环处理,使用GROUP_CONCAT可以简单快速的达到效果
SELECT
GROUP_CONCAT(NAME) AS 'names'
FROM material 

输出结果 : 螺纹钢,不锈钢,工字钢

  • 情景2
    在属性与材料不在一个表的情况下,我们在项目里可能会需要查看某种材料拥有的所有属性,可以使用GROUP_CONCAT函数来进行查询
SELECT
ID as 'id',
NAME as 'name',
(SELECT GROUP_CONCAT(DISTINCT ATTR_NAME) FROM attr t2 WHERE t2.MATERIAL_ID = t1.ID) as 'attrName'
FROM material t1

输出结果:
在这里插入图片描述
函数FIND_IN_SET

  • 语法: FIND_IN_SET(str,strlist)

str 要查询的字符串 strlist 字段名 参数以”,”分隔 如 ‘a,b,c,d’
假如字符串str在由N个子字符串组成的字符串列表strlist中,则返回值为str在strlist所在位置的下标,其范围在1-N之间,如果不存在则返回值0
FIND_IN_SET还可以跟在WHERE后面使用,使用后的结果集会过滤掉传入str对应字段不在strlist的数据行,其作用类似于IN
上述所讲函数GROUP_CONCAT其返回值就是为以”,”分割的字符串列表,他两可以搭配进行使用

情景1
判断字符串str是否在strlist字符串列表中

SELECT FIND_IN_SET('b', 'a,b,c,d')

返回结果:2

SELECT FIND_IN_SET('e', 'a,b,c,d')

返回结果:0

情景2
查询螺纹钢和不锈钢的所有信息,FIND_IN_SET此处用法类似于IN

SELECT
*
FROM material t1
WHERE
FIND_IN_SET(t1.name, '螺纹钢,不锈钢')

情景3
查询material 中属性与螺纹钢存在部分相同属性的材料的名称以及属性信息

  • FIND_IN_SET和GROUP_CONCAT同时使用
SELECT
t.NAME,
t0.ATTR_NAME,
t0.ATTR_VALUE
FROM material t LEFT JOIN attr t0 ON t.ID = t0.MATERIAL_ID
WHERE
FIND_IN_SET(t0.ATTR_NAME, 
(SELECT GROUP_CONCAT(ATTR_NAME) FROM attr t1, material t2 WHERE t1.MATERIAL_ID = t2.ID AND t2.NAME = '螺纹钢')
)
AND t.NAME != '螺纹钢'

输出结果:在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值