MySQL CTE Recursive With Join Another Table(MySQL CTE递归与连接另一个表)
本文介绍了MySQL CTE递归与连接另一个表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
伟大的开发人员您好!
我有一个案例,带有MySQL查询。 这里是一个示例架构in SQL Fiddle
表架构:
CREATE TABLE account (
id_account varchar(50),
account_name varchar(50),
account_type varchar(4)
);
INSERT INTO account VALUES
('chiira', 'Chiira', '1110'),
('rdp', 'RDP', '1100');
CREATE TABLE account_type_master (
account_type varchar(4),
account_type_name varchar(50),
account_type_parent varchar(4)
);
INSERT INTO account_type_master VALUES
('1000', 'Master Account', null),
('1100', '2nd Master', '1000'),
('1110', '3rd Master', '1100');
所以,我有2张桌子。
account table
===============================================================
| id_account | account_name | account_type |
===============================================================
| chiira | Chiira | 1110 |
| rdp | Chloe | 1100 |
| lotus | Lotus | 1111 |
===============================================================
account_type_master
===================================================================
| account_type | account_type_name | account_type_parent |
===================================================================
| 1000 | Master Account | null |
| 1100 | 2nd Master | 1000 |
| 1110 | 3rd Master | 1100 |
| 1111 | Last Master | 1110 |
===================================================================
所以,我的目标是单行获取Account表的所有Account_type父项的数据,父项数不受限制,如下所示
============================================================================================
| id_account | account_name | account_type | account_parent_all |
============================================================================================
| chiira | Chiira | 1110 | 1100 => 1000 |
| rdp | Chloe | 1100 | 1000 |
| lotus | Lotus | 1111 | 1110 => 1100 => 1000 |
============================================================================================
如何做到这一点? 谢谢:)
推荐答案
您可以使用此递归CTE查询,该查询查找给定id_account
的所有父值,然后使用GROUP_CONCAT
将这些值联接在一起以获得account_parent_all
值:
WITH RECURSIVE CTE AS (
SELECT a.id_account, a.account_name, a.account_type, m.account_type_parent, 0 AS depth
FROM account a
JOIN account_type_master m ON m.account_type = a.account_type
UNION ALL
SELECT c.id_account, c.account_name, c.account_type, m.account_type_parent, c.depth + 1
FROM CTE c
JOIN account_type_master m ON m.account_type = c.account_type_parent
WHERE c.account_type_parent IS NOT NULL
)
SELECT c.id_account, c.account_name, c.account_type,
GROUP_CONCAT(c.account_type_parent ORDER BY c.depth SEPARATOR ' => ') AS account_parent_all
FROM CTE c
GROUP BY c.id_account, c.account_name, c.account_type
ORDER BY c.account_name
输出:
id_account account_name account_type account_parent_all
chiira Chiira 1110 1100 => 1000
rdp Chloe 1100 1000
lotus Lotus 1111 1110 => 1100 => 1000
Demo on dbfiddle
这篇关于MySQL CTE递归与连接另一个表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:MySQL CTE递归与连接另一个表


猜你喜欢
- 导入具有可变标题的 Excel 文件 2021-01-01
- 在SQL中,如何为每个组选择前2行 2021-01-01
- 如何将 Byte[] 插入 SQL Server VARBINARY 列 2021-01-01
- SQL 临时表问题 2022-01-01
- 如何使用 pip 安装 Python MySQLdb 模块? 2021-01-01
- 远程 mySQL 连接抛出“无法使用旧的不安全身份验证连接到 MySQL 4.1+"来自 XAMPP 的错误 2022-01-01
- 如何将 SonarQube 6.7 从 MySQL 迁移到 postgresql 2022-01-01
- 使用 Oracle PL/SQL developer 生成测试数据 2021-01-01
- 更改自动增量起始编号? 2021-01-01
- 以一个值为轴心,但将一行上的数据按另一行分组? 2022-01-01