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

mysql中find_in_set()函数的使用, ancestors字段,树形查询

1. 函数定义与作用

FIND_IN_SET(str, strlist) 函数用于在一个由逗号分隔的字符串列表(strlist) 中查找某个特定字符串(str) 的位置。

  • 返回值:如果找到字符串,则返回其所在的位置(从 1 开始计数);如果未找到,则返回 0;如果任一参数为 NULL,则返回 NULL

  • 核心特点:它专门用于处理以逗号 , 分隔的字符串,而不是任意分隔符。

2. 语法

FIND_IN_SET(needle, haystack)
  • needle:要查找的字符串。

  • haystack:由逗号分隔的字符串列表。

3. 使用示例

示例 1:基本查找
SELECT FIND_IN_SET('b', 'a,b,c,d'); -- 返回 2
SELECT FIND_IN_SET('x', 'a,b,c,d'); -- 返回 0
SELECT FIND_IN_SET('', 'a,b,c,d');  -- 返回 0 (空字符串找不到)
SELECT FIND_IN_SET('b', '');        -- 返回 0
SELECT FIND_IN_SET(NULL, 'a,b,c');  -- 返回 NULL
SELECT FIND_IN_SET('a', NULL);      -- 返回 NULL

4. 示例

正确示范(使用 FIND_IN_SET()):
FIND_IN_SET() 可以精确匹配列表中的每一项。

SELECT * FROM users WHERE FIND_IN_SET('music', hobbies) > 0;

结果

idnamehobbies
1Alicereading,music,hiking
2Bobmusic,game

注意> 0 可以省略,因为在 MySQL 中非零值被视为 TRUE,零被视为 FALSE。但为了代码清晰,建议保留。

-- 这样写也是有效的
SELECT * FROM users WHERE FIND_IN_SET('music', hobbies);

5. 树形结构妙用

部门表,  添加修改维护 ancestors字段,  记录祖先节点ID. 查询子部门可以通过下面的sql语句

select * from sys_dept where find_in_set(#{deptId}, ancestors)

6. 注意事项与局限性

  1. 性能问题FIND_IN_SET() 函数无法使用索引。因为它需要遍历整个字符串列表并进行拆分匹配。在数据量大的表上,用 WHERE FIND_IN_SET(...) > 0 作为查询条件会导致全表扫描,性能非常差。

  2. 设计缺陷:像上面 hobbies 这样用一个字段存储多个值(逗号分隔),违反了数据库设计的第一范式(1NF)。这会导致数据冗余、更新困难、查询复杂且低效。

  3. 精确匹配:它是完全匹配,区分大小写(取决于您的字符集和校对规则)。FIND_IN_SET(‘B’, ‘a,b,c’) 和 FIND_IN_SET(‘b’, ‘a,B,c’) 的结果可能不同。

  4. 仅支持逗号分隔:它只能处理逗号 , 分隔的列表。如果您的列表是用分号 ; 或空格等其他符号分隔的,这个函数将无法工作。

总结

  • FIND_IN_SET() 是一个方便的工具,用于查询逗号分隔的字符串列表

  • 它适用于轻量级、临时性的查询,或者处理无法改变的表结构

  • 正式的、高性能要求的数据库设计中,应避免使用它。取而代之的是使用关系表 + JOIN 的规范化设计方式。

http://www.xdnf.cn/news/1457587.html

相关文章:

  • AI视频画质提升效果实用指南:提升清晰度的完整路径
  • [论文阅读] 软件工程 | REST API模糊测试的“标准化革命”——WFC与WFD如何破解行业三大痛点
  • 【论文阅读】-《Besting the Black-Box: Barrier Zones for Adversarial Example Defense》
  • AutoLayout与Masonry:简化iOS布局
  • (E题|AI 辅助智能体测)2025年高教杯全国大学生数学建模国赛解题思路|完整代码论文集合
  • 解密llama.cpp:Prompt Processing如何实现高效推理?
  • Nginx 实战系列(一)—— Web 核心概念、HTTP/HTTPS协议 与 Nginx 安装
  • Scikit-learn Python机器学习 - 特征预处理 - 归一化 (Normalization):MinMaxScaler
  • 孩子学手机里的坏毛病,怎样限制他打开某些APP?
  • Flutter 3.35.2 以上版本中 数字转字符串的方法指南
  • 机器学习基础-day05-深度学习框架PyTorch的tensor及PyTorch进行线性回归
  • 猫头虎AI 荐研|腾讯开源长篇叙事音频生成模型 AudioStory:统一模型,让 AI 会讲故事
  • 数据结构 之 【哈希的相关概念】
  • npm/pnpm软链接的优点和使用场景
  • 2025精选榜:4款好用的企业即时通讯软件推荐!安全有保障
  • 【Proteus仿真】AT89C51单片机中断系列仿真——INT0中断控制LED小灯/INT0和INT1中断控制数码管
  • 小白也能看懂,HTTP中的文件上传与下载到底发生了什么?
  • Spring 框架(IoC、AOP、Spring Boot) 的必会知识点汇总
  • 2025 年高教社杯全国大学生数学建模竞赛C 题 NIPT 的时点选择与胎儿的异常判定 完整成品思路模型代码分享,全网首发高质量!!!
  • 【笔记】AI Agent发展趋势
  • PostgreSQL与SQL Server:为什么 PostgreSQL遥遥领先
  • 异地多活架构:从“机房炸了”到“用户无感”的逆袭之路
  • Linux里面安装Genetic Algorithm Toolbox for MATLAB R2023b
  • unittest自动化测试框架详解
  • c# .net中using的使用
  • vue3入门- script setup详解下
  • (C题|NIPT 的时点选择与胎儿的异常判定)2025年高教杯全国大学生数学建模国赛解题思路|完整代码论文集合
  • 信息化安全性测试中漏洞扫描的定义与核心目的
  • 【DINOv3教程2-热力图】使用DINOv3直接生成图像热力图【附源码与详解】
  • Linux高手才知道的C++高性能I/O秘诀:Vector I/O与DMA深度解析