Mysql正则实现likein效果
⽂章⽬录
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__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
_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 (‘0010020
02’, ‘⼆级节点-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 实际操作(错误)
regexp like期望 根据 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’);
结果 正常 问题 解决, 拿到 全部所需 数据
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论