【问题标题】:MySQL CTE Recursive With Join Another TableMySQL CTE 递归与加入另一个表
【发布时间】:2020-10-11 22:13:27
【问题描述】:

你好伟大的开发者!

我有一个案例,使用 MySQL Query。 这是一个示例架构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_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       |
============================================================================================

如何做到这一点? 谢谢你:)

【问题讨论】:

    标签: mysql recursion common-table-expression


    【解决方案1】:

    您可以使用此递归 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多