FIND_IN_SET的使用:mysql表数据多角色、多用户查询

MySQL 函数 FIND_IN_SET 是用于在逗号分隔的字符串中查找特定值的函数。它的语法如下:

FIND_IN_SET(search_value, comma_separated_string)
search_value 是要查找的值。
comma_separated_string 是逗号分隔的字符串,在这个字符串中查找指定的值。

FIND_IN_SET 函数会返回一个整数值,表示搜索值在逗号分隔的字符串中的位置。如果找到了,则返回该值在字符串中的位置(从 1 开始计数),如果未找到,则返回 0。

下面是一个示例代码,展示如何使用 FIND_IN_SET 函数:

-- 假设有一个表名为 users,包含 id 和 name 两列
SELECT id, name
FROM users
WHERE FIND_IN_SET('John', name) > 0;

上述示例中,我们使用了 FIND_IN_SET 函数在 name 列的逗号分隔的字符串中查找值为 ‘John’ 的记录。如果找到了,则返回对应的 id 和 name 值。

需要注意的是,FIND_IN_SET 函数适用于逗号分隔的字符串,通常用于存储一对多关系的数据。然而,使用逗号分隔的字符串来存储数据并不是一个良好的数据库设计实践,它可能会导致查询和更新操作的性能问题。如果可能的话,应该考虑使用关联表来表示一对多的关系。


当使用字符串分割的方式存储角色ID和用户ID列表时,可以通过SQL的字符串函数来处理查询条件。下面是一个示例的SQL查询语句和MyBatis Plus的示例代码:

SQL查询语句示例:

SELECT * FROM 节点表
WHERE FIND_IN_SET('角色ID', role_ids) > 0
AND FIND_IN_SET('用户ID', user_ids) > 0;

上述查询语句中,使用了MySQL的内置函数FIND_IN_SET()来判断指定的角色ID和用户ID是否存在于对应的列表中。

MyBatis Plus示例代码:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

// 假设 NodeMapper 是节点表的 Mapper 接口
// Node 是节点表对应的实体类

public class NodeServiceImpl extends ServiceImpl<NodeMapper, Node> implements NodeService {

    // 根据角色ID和用户ID查询节点列表
    public List<Node> getNodesByRoleAndUser(String roleId, String userId) {
        QueryWrapper<Node> queryWrapper = new QueryWrapper<>();
        queryWrapper.apply("FIND_IN_SET({0}, role_ids) > 0", roleId)
                    .apply("FIND_IN_SET({0}, user_ids) > 0", userId);
        return baseMapper.selectList(queryWrapper);
    }
}

在上述示例代码中,使用了MyBatis Plus的QueryWrapper来构建动态查询条件,通过apply()方法将字符串函数作为查询条件应用到查询语句中。

请注意,使用字符串分割存储角色ID和用户ID列表的方式可能会导致一些性能问题,尤其是在数据量较大的情况下。考虑到查询和更新的复杂性,拆分为多张表可能会更加清晰和高效。但如果你仍然希望使用单张表的设计,请在实际使用中进行性能测试和优化。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 中的 FIND_IN_SET 函数用于查找一个字符串中是否包含指定的子字符串,它的语法如下: ``` FIND_IN_SET(str, strlist) ``` 其中,str 是要查找的子字符串,strlist 是要在其中查找的字符串列,它们都是字符串类型。这个函数会返回一个整数值,示 str 在 strlist 中的位置,如果没有找到,则返回 0。 FIND_IN_SET 函数通常用于将多个选项存储在一个字段中,例如在一个用户中存储该用户喜欢的颜色(以逗号分隔),然后使用 FIND_IN_SET 函数查找是否包含指定颜色。 例如,假设有一个用户 user,其中有一个字段 colors 存储了用户喜欢的颜色,它们以逗号分隔,如下所示: ``` +----+---------+------------+ | id | name | colors | +----+---------+------------+ | 1 | Alice | red,green | | 2 | Bob | blue,red | | 3 | Charlie | green | +----+---------+------------+ ``` 现在,我们想要查找所有喜欢红色的用户,可以使用以下 SQL 语句: ``` SELECT * FROM user WHERE FIND_IN_SET('red', colors) > 0; ``` 这个 SQL 语句会返回 id 为 1 和 2 的两条记录,因为它们的 colors 字段包含了红色这个选项。 总的来说,FIND_IN_SET 函数适用于需要在一个字段中存储多个选项的场景,并且需要进行筛选和查询。但是,如果需要在一个字段中存储大量的选项,或者需要对选项进行排序和统计等操作,则不建议使用 FIND_IN_SET 函数,而是应该使用关系型数据库中的更加规范化的数据结构来存储选项,例如使用多个或者使用 JSON 数据类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值