MySQL 根据一个值查询数据表中某个字段包含某个数值 | find_in_set()

本文介绍如何使用 MySQL 的 FIND_IN_SET 函数来查询一个字段中是否包含特定的值。这种场景通常出现在多对多关系的数据存储中,通过逗号分隔的 ID 列表来实现。文中提供了具体的 SQL 查询示例以及 mybatis 中的应用。

MySQL 根据一个值查询数据表中某个字段包含某个数值 | find_in_set()


一、业务描述

我有一个表结构,其中一个字段是多选的情况,所以使用多的一方表的ID用","逗号拼接起来存进这个字段,如下图所示:(每个字段里都是其他表的主键ID)
在这里插入图片描述

现在需要根据多的一方表中的某个ID去查询包含这个ID 的数据,如以上三个字段,都是一对多,包含其他表的ID,然后我根据 certification_id 和 patent_id 去查询


二、FIND_IN_SET(str,strList) 函数的语法

  • str 要查询的字符串
  • strList 字段名,参数以“,”分隔,如(1,2,6,8)
  • 查询字段(strList)中包含的结果,返回结果null或记录。

三、测试(在真实sql查询中匹配到则有数据返回,没匹配到则不返回)

- 3.1 匹配到则返回相应的下标(下标从1开始):

在这里插入图片描述

- 3.2 没匹配到则返回0:

在这里插入图片描述


四、实例

4.1 数据库中的数据

在这里插入图片描述


4.2 以certification_id 的 1和4 、patent_id 的 2 去查询,同时匹配到则返回数据

在这里插入图片描述


五、扩展

5.1 中文存入其中也可以进行,字符串都行
5.2 在 mybatis 的 xml 中使用示例(根据需求改动):

在这里插入图片描述


欢迎关注公众号:慌途L
后面会慢慢将文章迁移至公众号,也是方便在没有电脑的情况下可以进行翻阅,更新的话会两边同时更新,大家不用担心!
在这里插入图片描述


MySQL 中,如果需要查询 JSON 类型字段中的,并结合使用 `FIND_IN_SET()` 函数,需要先了解如何从 JSON 字段中提取数据,然后将其转换为逗号分隔的字符串格式,以便 `FIND_IN_SET()` 能够处理。 ### 从 JSON 字段中提取数据 MySQL 提供了多种函数来操作 JSON 类型的数据,其中 `JSON_EXTRACT()` 是最常用的函数之一,用于从 JSON 字段中提取特定的。例如,假设有一个表 `users`,其中有一个 JSON 字段 `roles`,存储了用户的角色列表: ```sql SELECT JSON_EXTRACT(roles, '$') AS role_list FROM users; ``` 此查询将返回 `roles` 字段中的所有。如果 `roles` 是一个 JSON 数组,则可以将其转换为逗号分隔的字符串,以便与 `FIND_IN_SET()` 一起使用。 ### 将 JSON 数组转换为逗号分隔的字符串 MySQL 提供了 `JSON_UNQUOTE()` 和 `REPLACE()` 函数来处理 JSON 数组并将其转换为逗号分隔的字符串。例如,假设 `roles` 是一个 JSON 数组,包含多个角色名称: ```sql SELECT REPLACE(JSON_UNQUOTE(JSON_EXTRACT(roles, '$')), '","', ',') AS role_string FROM users; ``` 此查询首先使用 `JSON_EXTRACT()` 提取 JSON 数组的内容,然后通过 `JSON_UNQUOTE()` 去除引号,并使用 `REPLACE()` 替换双引号和逗号为仅逗号,从而生成一个逗号分隔的字符串。 ### 结合 `FIND_IN_SET()` 查询特定 一旦将 JSON 数组转换为逗号分隔的字符串,就可以使用 `FIND_IN_SET()` 函数来查询特定是否存在于该字符串中。例如,查询角色中是否包含 `'admin'`: ```sql SELECT * FROM users WHERE FIND_IN_SET('admin', REPLACE(JSON_UNQUOTE(JSON_EXTRACT(roles, '$')), '","', ',')) > 0; ``` 此查询将返回所有 `roles` 字段包含 `'admin'` 的记录。 ### 示例代码 以下是一个完整的示例,展示如何从 JSON 字段中提取数据并结合 `FIND_IN_SET()` 进行查询: ```sql -- 创建示例表 CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100), roles JSON ); -- 插入示例数据 INSERT INTO users (id, name, roles) VALUES (1, 'Alice', '["admin", "user"]'), (2, 'Bob', '["user"]'), (3, 'Charlie', '["guest", "admin"]'); -- 查询包含 'admin' 角色的用户 SELECT * FROM users WHERE FIND_IN_SET('admin', REPLACE(JSON_UNQUOTE(JSON_EXTRACT(roles, '$')), '","', ',')) > 0; ``` 此查询将返回所有 `roles` 字段包含 `'admin'` 的用户记录。 ### 注意事项 1. **性能问题**:由于 `FIND_IN_SET()` 是字符串匹配函数,无法利用索引,因此在大数据量表中使用时可能会导致性能问题。 2. **数据格式要求**:`FIND_IN_SET()` 要求输入的字符串必须是逗号分隔的列表,因此需要确保从 JSON 字段中提取的数据格式正确。 3. **边界情况处理**:如果 JSON 字段为空或包含非字符串数据,可能需要额外的处理来避免错误[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值