今天在开发过程中,遇到mysql 数据库中一个字段里面,存有多条数据,并用 ; 区分,查询的时候,需要通过当前字段关联业务表,查询对应的 业务名称。
第一反应是类似 mybatis的 split(';') 的写法,但当前字段为查询结果而不是查询条件,且有可能为空的情况,排除当前操作。
第二种方式,通过查询,找到 substring_index 用法,但这个函数又不满足我当前的业务需求 ---- 关联查询所有的内容,substring_index 如果需要关联查询所有的内容,需要结合mysql.help_topic 使用,太复杂了,放弃。
第三、查询出结果后,再Java代码中进行遍历取值查询,这种方式可行,但需要多次访问数据库,效率方法不是很友好,可作为最后的保底实现方案。
但不甘心与此,在查询优化 substring_index 用法的过程中,无意间发现 FIND_IN_SET 用法,结合业务做简单的测试,发现完全符合我当前的需求:
1. 根据指定字符串区分多条数据
2. 能正常关联查询所有的业务名称
FIND_IN_SET:FIND_IN_SET(str,strlist),该函数用于判断 str 是否在 strlist 中,如果是,作为条件,返回对应数据,如果str不在strlist 或strlist 为空字符串,则返回值为 0 。其中 strlist 中默认是以 , 作为数据分隔符 ,根据我目前所查阅到的资料,这个是不能修改的,只能通过sql语句,把我们的业务数据分隔符替换为 ,
好了, FIND_IN_SET 简单的介绍和用法就到了,本文仅做为一个简单记录,最后,带上我本次的查询实例
select
(select GROUP_CONCAT(distinct name separator ';') from B where FIND_IN_SET (id, REPLACE (t.limit_supplier, ';', ',')))
from A t
注:
1. 表名均为示例假表名
2. id 为B 表的 主键字段,limit_supplier 列中存有多个B表的 主键 ID,通过 FIND_IN_SET 进行 in 查询