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

有两个表A,B,表结构如下:

A表
B表

关联关系说明如下:

(1)A.hospital_catalog=B.id

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

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

解决办法:

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.id

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

查询效果如下:

查询思路解析:

①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

猜你喜欢

转载自blog.csdn.net/myme95/article/details/82661661
今日推荐