文章目录

  • 0. 痛点分析
    • 1. MySQL 中 不能 同时 使用 like in 关键字
    • 2.MySQL 函数 的 高级 应用 REGEXP 与 GROUP_CONCAT 组合 使用 实现 like in 效果
  • 1.情景 描述
  • 2.解决 思路
    • 2.1. 使用 GROUP_CONCAT()函数 对 查询 出 的 多行 数据 结果 进行 拼接
    • 2.2. 使用 REGEXP 进行 正则匹配
  • 3.注意 事项:
    • 3.1如果 使用
  • 4.实际 操作 演示
    • 4.1 创建 数据库 表
    • 4.2 插入 数据
    • 4.3 实际 操作(错误)
    • 4.4 实际 操作(正确)

0. 痛点分析

1. MySQL 中 不能 同时 使用 like in 关键字

​ 1.1 like 模糊 查询 关键字

​ 1.2 in 多条件 查询 关键字

​ like in 理论上 实现 的是 就是 多条件 查询 ,但是 Mysql 的 语法 并不支持 该实现,因此 有些 需求 想要 实现 like in 的 效果,只能 通过大量 子查询 实现 ,而且 实现 的 效果 功能 非常 不智能

2.MySQL 函数 的 高级 应用 REGEXP 与 GROUP_CONCAT 组合 使用 实现 like in 效果

​ 使用 MySQL 的 正则 实现 like in 的 效果 思路 如下:

组合 使用 实现 like in 效果

1.情景 描述

表A 为 自关联 表 ( 即 为 id ,pid 的 树 结构 表)

表B 为 普通 表

表C 为 A 和 B 的 中间 表

现在 需要 实现 通过 表C 中 取到的 不定级 的 A 表 ID (也就是树节点 的 不定级 叶子 节点) 以及 A表 中 该 ID 所关联 的所有 叶子节点,前提 ID 与 PID 是 有规律 的, 也就是 树 结构 的 id 是 xxx , xxxyyy , xxxyyyzzz 这种 可以 推导规律的 形式 存储 的 数据 结构

SELECT

org_id

FROM

base_org

WHERE

org_id REGEXP

(

SELECT

GROUP_CONCAT(orgUser.org_id separator ‘|’)

from

base_org_user orgUser

where

orgUser.user_id = #{params.userId}

)

2.解决 思路

2.1. 使用 GROUP_CONCAT()函数 对 查询 出 的 多行 数据 结果 进行 拼接

2.2. 使用 REGEXP 进行 正则匹配

3.注意 事项:

3.1如果 使用

org_id like

(

SELECT

CONCAT(orgUser.org_id,’%’)

from

base_org_user orgUser

where

orgUser.user_id = #{params.userId}

)

的 时候 当 子查询 的 数据 为 1 条 的 时候 可以 正常 执行,但是 当 数据 量 大于 1 条 的时候 则 会出现 错误, 因此 则 需 使用 正则 进行 数据 匹配

4.实际 操作 演示

4.1 创建 数据库 表

CREATE TABLE tree_table (
tree_id varchar(36) NOT NULL COMMENT ‘节点ID’,
tree_node_name varchar(32) DEFAULT NULL COMMENT ‘本级名称’,
p_tree_id varchar(32) DEFAULT NULL COMMENT ‘上级节点ID’,
PRIMARY KEY (tree_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘树结构表’;

CREATE TABLE normal_table (
normal_id varchar(36) NOT NULL COMMENT ‘表ID’,
normal_name varchar(32) DEFAULT NULL COMMENT ‘名称’,
PRIMARY KEY (normal_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘普通表’;

CREATE TABLE tree_normal_table (
table_id varchar(36) NOT NULL COMMENT ‘表ID’,
normal_id varchar(32) DEFAULT NULL COMMENT ‘普通表ID’,
tree_id varchar(32) DEFAULT NULL COMMENT ‘树结构表 节点ID’,
PRIMARY KEY (table_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘中间表’;

4.2 插入 数据

INSERT INTO tree_table (tree_id, tree_node_name, p_tree_id) VALUES (‘001’, ‘顶级节点’, ‘-1’);
INSERT INTO tree_table (tree_id, tree_node_name, p_tree_id) VALUES (‘001001’, ‘一级节点-1’, ‘001’);
INSERT INTO tree_table (tree_id, tree_node_name, p_tree_id) VALUES (‘001001001’, ‘二级节点-11’, ‘001001’);
INSERT INTO tree_table (tree_id, tree_node_name, p_tree_id) VALUES (‘001001001001’, ‘三级节点-111’, ‘001001001’);
INSERT INTO tree_table (tree_id, tree_node_name, p_tree_id) VALUES (‘001001001002’, ‘三级节点-112’, ‘001001001’);
INSERT INTO tree_table (tree_id, tree_node_name, p_tree_id) VALUES (‘001001002’, ‘二级节点-12’, ‘001001’);
INSERT INTO tree_table (tree_id, tree_node_name, p_tree_id) VALUES (‘001002’, ‘一级节点-2’, ‘001’);
INSERT INTO tree_table (tree_id, tree_node_name, p_tree_id) VALUES (‘001002001’, ‘二级节点-21’, ‘001002’);
INSERT INTO tree_table (tree_id, tree_node_name, p_tree_id) VALUES (‘001002002’, ‘二级节点-22’, ‘001002’);

INSERT INTO normal_table (normal_id, normal_name) VALUES (‘1’, ‘普通表1’);
INSERT INTO normal_table (normal_id, normal_name) VALUES (‘2’, ‘普通表2’);
INSERT INTO normal_table (normal_id, normal_name) VALUES (‘3’, ‘普通标3’);

INSERT INTO tree_normal_table (table_id, normal_id, tree_id) VALUES (‘1’, ‘1’, ‘001002’);
INSERT INTO tree_normal_table (table_id, normal_id, tree_id) VALUES (‘2’, ‘1’, ‘001001’);
INSERT INTO tree_normal_table (table_id, normal_id, tree_id) VALUES (‘3’, ‘2’, ‘001001’);

4.3 实际 操作(错误)

期望 根据 tree_nomal_table 表中 normal_id = 1 的 时候 tree_table 中 的 父级 节点 对应 的 所有 子 节点

  1. like + contcat() 的 实现

SELECT * from tree_table WHERE tree_id like (SELECT CONCAT(tree_id,’%’) FROM tree_normal_table where normal_id = ‘2’);

通过 查看 中间 表( tree_normal_table) 可以 知道 ,

该 中间 表中 仅存在 normal_id = ‘2’ 的 记录 只存 在一条 的 时候 ,执行 结果 正常 ,但是 当 normal_id = ‘1’ 的时候 ,则会出现 如下 问题

会提示 子查询 数量 过多

4.4 实际 操作(正确)

​ 正确 的 写 法 如下:

SELECT * from tree_table WHERE tree_id REGEXP (SELECT GROUP_CONCAT(tree_id separator ‘|’) FROM tree_normal_table where normal_id = ‘1’);

​ 结果 正常 问题 解决, 拿到 全部所需 数据

Mysql 正则 实现 like in 效果相关推荐

  1. mysql正则替换html代码

    在mysql中没有正则替换函数. 用下面的代码可以实现类似正则替换的效果 update youtable set content = replace(content,substring(content ...

  2. Sql Server中实现Mysql中的group_concat函数效果

    Sql Server中实现Mysql中的group_concat函数效果 SELECT oi.*, stuff((select ','+convert(varchar(25), GuestName) ...

  3. php+mysql 大容量数据高效分页效果(弃用limit)

    发现当表中有很多上万条数据时,越后的数据用limit分页显示就越慢(>2秒),可能是mysql的特性所致.所以花了点时间总结实现了更优解决方案,最终实现毫秒级响应.若网友有更优的,请留言,谢谢! ...

  4. mysql 正则 java 区别_MySQL中的正则表达式

    MySQL中允许使用正则表达式定义字符串的搜索条件,性能比like匹配查询还高 MySQL中的正则表达式可以对整数类型或者字符类型检索 使用REGEXP关键字表示正则匹配,默认忽略大小写,如果区分大小 ...

  5. php mysql 正则_MySQL 正则表达式

    MySQL 正则表达式 在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配. MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正 ...

  6. php mysql 高效,php+mysql 大容量数据高效分页效果(弃用limit)

    发现当表中有很多上万条数据时,越后的数据用limit分页显示就越慢(>2秒),可能是mysql的特性所致.所以花了点时间总结实现了更优解决方案,最终实现毫秒级响应.若网友有更优的,请留言,谢谢! ...

  7. mysql 正则 换行符_MySQL 正则表达式

    在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配. MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配. 如果您了 ...

  8. ORACLE和MYSQL一些函数和实现效果的对比、替换

    工作中用到了oracle和mysql,所以如果sql有差异性就要提供两套.这篇文章来总结下oracle和mysql函数之间的区别.是否可替换. 一.Oracle的with x AS (子查询), y ...

  9. mysql正则替换字符串某些内容_mysql基于正则实现模糊替换字符串的方法分析

    本文实例讲述了mysql基于正则实现模糊替换字符串的方法.分享给大家供大家参考,具体如下: 例如: abcd(efg)hijk 替换之后是abcdhijk 复制代码 代码如下: update taba ...

最新文章

  1. delphi 遍历所有文件夹
  2. flink on yarn shell的session cluster模式实验记录
  3. 【纠错】——mysql Authentication plugin ‘caching_sha2_password‘ is not supported问题处理
  4. jpa避免n+1_JPA技巧:避免N + 1选择问题
  5. 让你的原创设计作品展示给世界
  6. 产品经理该如何做竞品分析
  7. APT攻防整理-常用CVE
  8. java毕向东学习笔记——day01
  9. C语言实现蔡勒公式,用于给定年月日计算出当前是周几
  10. 关于Windows和Linux的那些事儿
  11. 如何将360全景图导出高清短视频分享到视频平台上?
  12. 微信公众号CSS样式常见问题解析
  13. 中国朝代顺序表 - 中国朝代更替表,中国历史朝代公元对照简表
  14. 剪切后的文件可以恢复吗?恢复剪切文件怎么办?
  15. 人工智能带来的岗位减少更多是重复性、机械性、门槛低的岗位
  16. 爬虫很调皮?来看看反爬虫收拾爬虫的法子有哪些!
  17. 钉钉启动时出现弹窗, 提示缺失MainFrame.dll程序模块 / 打开微信提示缺失wechatwin.dll / 其他部分软件提示缺失iertutil.dll
  18. Axure中动态面板中的“推动/拉动原件”
  19. 程序员该如何管理后宫:朕只爱一个皇后!(单例模式)
  20. 什么是SDK?MFC?

热门文章

  1. 2015年9月10日
  2. 在cmd中进入mysql的步骤
  3. 本地项目关联远程 git 仓库
  4. flash_back介绍
  5. python高分书籍推荐_如果只推荐一本 Python 书,我要 Pick 它!
  6. Oracle不走索引hint,oracle不走hint原因1:依据hint会出现错误结果
  7. [万字长文]使用 React 重写学成在线前端项目 I 代码完整可运行,步骤有详解
  8. HMM算法详解(内含推导)
  9. 32位超前进位加法器
  10. 求n的阶乘的算法框图_递归算法是一种直接或者间接调用自身函数或者方法的算法...