MySQL 根据指定字符串区分多条数据,关联查询,类似 in 操作

本文介绍了一种在MySQL中处理多值字段的有效方法——使用FIND_IN_SET函数。针对字段内存储多条以分号分隔的数据情况,作者详细探讨了如何利用FIND_IN_SET进行高效查询,避免了多次数据库访问带来的性能问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       今天在开发过程中,遇到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 查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值