mysql - Mysql 5.7.30 中的递归搜索
问题描述
我需要找到存在特定文本的父 ID 列表,无论它可能是在父名称中还是在其子名称中。
考虑下表
PID | 父母 | 姓名 |
---|---|---|
1 | 无效的 | 父1动态 |
2 | 无效的 | 父母2 |
3 | 1 | 孩子1-P1 |
4 | 2 | 儿童1-P2 |
5 | 4 | Child-c1p2-动态 |
6 | 无效的 | 家长3 |
7 | 无效的 | 家长4 |
8 | 7 | Child-p4-动态 |
我使用了以下 Mysql 查询
SELECT c.*
FROM db.tbl AS c
JOIN ( SELECT DISTINCT IFNULL(c.parent, c.pid) AS id
FROM db.tbl c
WHERE 1=1 AND c.name LIKE '%dyna%'
ORDER BY c.pid ASC ) s ON s.id = c.pid
WHERE parent IS NULL
ORDER BY pid LIMIT 0, 15
使用这个查询我搜索文本'dyna'并获得带有 ids [1 & 7] 的结果,它搜索第一级,但我需要结果为 [1, 2 & 7] - 递归搜索
解决方案
在 MySQL 8+ 中可能是
WITH RECURSIVE
cte AS ( SELECT pid, parent, name, pid rpid, pid rparent, name rname
FROM test
WHERE parent IS NULL
UNION ALL
SELECT test.pid, test.parent, test.name, cte.pid, cte.rparent, CONCAT(cte.rname, CHAR(0), test.name)
FROM cte
JOIN test ON cte.pid = test.parent )
SELECT DISTINCT rparent pid
FROM cte
WHERE rname LIKE @pattern;
或者
WITH RECURSIVE
cte AS ( SELECT pid, parent
FROM test
WHERE name LIKE @pattern
UNION ALL
SELECT test.pid, test.parent
FROM cte
JOIN test ON cte.parent = test.pid )
SELECT DISTINCT pid
FROM cte
WHERE parent IS NULL
在 MySQL 5+ 中使用存储过程:
CREATE PROCEDURE get_rows_like_pattern (IN pattern VARCHAR(255))
BEGIN
CREATE TABLE cte (pid INT PRIMARY KEY, parent INT)
SELECT pid, parent
FROM test
WHERE name LIKE pattern;
WHILE ROW_COUNT() DO
INSERT IGNORE INTO cte
SELECT test.pid, test.parent
FROM cte
JOIN test ON cte.parent = test.pid;
END WHILE;
SELECT DISTINCT pid
FROM cte
WHERE parent IS NULL;
DROP TABLE cte;
END
推荐阅读
- python - macOS Big Sur 更新后 python3.5 错误“未加载 dyld 库:CoreFoundation”
- oracle - Oracle:无法将数据从 max_string_size=extended 复制到 max_string_size=standard 数据库
- testing - 10 分钟后,nestjs jest 超时
- delphi - 调试第三方程序
- api - Instagram Graph API 访问令牌 - 数据访问 - 续订
- delphi - 启用 VCL 样式时的 TActionMainMenuBar 绘制错误
- r - 对用正则表达式提取的数字应用简单的数学函数
- python - 具有非整数索引和 groupby 的 pandas DataFrame 应用
- windows - 如何在 Windows 中构建和运行 Clang 插件
- blazor-webassembly - 这是什么“发布到 Azure 时出现链接器错误?以前版本的 .net 运行良好