SQL基础--(GROUP_CONCAT, FIND_IN_SET)

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

  • material(材料表)

SQL基础--(GROUP_CONCAT, FIND_IN_SET)_第1张图片

  • attr(材料属性表)

SQL基础--(GROUP_CONCAT, FIND_IN_SET)_第2张图片
函数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

输出结果:
SQL基础--(GROUP_CONCAT, FIND_IN_SET)_第3张图片
函数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 != '螺纹钢'

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

你可能感兴趣的:(数据库,sql,数据库)