数据库中某个表中的某个字段的值是用逗号隔开的多个值,根据逗号拆分并从另外一个表中查出数据返回

有两个表A,B,表结构以下:html

A表
B表

关联关系说明以下:mysql

(1)A.hospital_catalog=B.idsql

(2)A表中hospital_catalog字段的值是以 逗号 “,” 隔开,且两边用中括号“[ ]”包起,A中hospital_catalog的值是B的idyii

查询要求:查询A表中的数据,其中hospital_catalog字段要求将数字id换成对应的param_valueide

解决办法:函数

select  A.id,  A.hospital_catalog as '机构类型编号',  GROUP_CONCAT(B.param_value) as '机构类型'
from A JOIN B
on FIND_IN_SET( B.id, REPLACE (REPLACE (A.hospital_catalog, '[', ''),']','')  )
GROUP BY A.idspa

(注:以上颜色标记仅为了方便区分阅读,无其余意义,加粗处为本次查询的重点所在)htm

查询效果以下:blog

 

查询思路解析:字符串

①hospital_catalog字段存储时,使用中括号“[ ]”包起来的,因此第一步要去掉中括号(若是没有中括号,这一步能够省略),故而用到方法replace,此处的去中括号语句为: REPLACE ( REPLACE (A.hospital_catalog, '[', '') ,']','')  。其中紫色部分为去除中括号的左半部分“ [ ”,红色部分是在去掉左半部分括号的基础上去掉右半部分的括号“]”。 去除以后,本来是“[28,137,30]”的数据会变成“28,137,30”

FIND_IN_SET(str,strlist),该函数用于判断 str 是否在 strlist 中,若是是,做为条件,返回对应数据,若是str不在strlist 或strlist 为空字符串,则返回值为 0 。

③group_concat(),官方:该函数返回带有来自一个组的链接的非NULL值的字符串结果。
通俗点理解:group_concat()会计算哪些行属于同一组,将属于同一组的列按照必定的拼接规则拼接好显示出来。形象的来讲就是把列里的内容转化到了行里。

 

参考资料:

https://www.yiibai.com/mysql/find_in_set.html

https://baijiahao.baidu.com/s?id=1595349117525189591&wfr=spider&for=pc