MySQL CTE 递归加入另一个 Table

MySQL CTE Recursive With Join Another Table

伟大的开发者您好!

我有一个案例,用MySQL查询。 这里有一个示例模式 in SQL Fiddle

Table 架构:

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 个 table。

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                  |
===================================================================

所以,我的目标是获取帐户 table 的数据,所有 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 的所有父 account_type 值,然后使用 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