当前位置: 首页 > news >正文

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列表的方式可能会导致一些性能问题,尤其是在数据量较大的情况下。考虑到查询和更新的复杂性,拆分为多张表可能会更加清晰和高效。但如果你仍然希望使用单张表的设计,请在实际使用中进行性能测试和优化。

http://www.lryc.cn/news/289195.html

相关文章:

  • JVM篇----第十一篇
  • 鸿蒙HarmonyOS获取GPS精确位置信息
  • java正则校验,手机号,邮箱,日期格式,时间格式,数字金额两位小数
  • php下curl发送cookie
  • stable diffusion学习笔记——文生图(一)
  • Linux下安装openresty
  • 【IM】如何保证消息可用性(一)
  • js直接下载附件和通过blob数据类型下载文件
  • 第2章-神经网络的数学基础——python深度学习
  • 【Docker】Docker学习⑧ - Docker仓库之分布式Harbor
  • 一行命令在 wsl-ubuntu 中使用 Docker 启动 Windows
  • Datawhale 组队学习之大模型理论基础 Task7 分布式训练
  • 05-使用结构体构建相关数据
  • 【Android】Android中的系统镜像由什么组成?
  • 仿真机器人-深度学习CV和激光雷达感知(项目2)day7【ROS关键组件】
  • 解锁一些SQL注入的姿势
  • Qt 拖拽事件示例
  • Linux:命名管道及其实现原理
  • 实习记录——第五天
  • Kotlin 教程(环境搭建)
  • 04.领域驱动设计:了解聚合和聚合根,怎样设计聚合-学习总结
  • cmake-find_package链接第三方库
  • obsidian阅读pdf和文献——与zotero连用
  • 走方格(动态规划)
  • 基于DataKit迁移MySQL到openGauss
  • API网关-Apinto压缩包方式自动化安装配置教程
  • 内网穿透natapp使用教程(Linux)
  • php函数 二
  • IDC机房交换机核心技术与应用指南
  • Compose | UI组件(五) | Button 按钮组件