递归 - 在 sql 中链接数据 - 卡住了

Recursion - chaining data in sql - stuck

我有不同的 tables,目标是为每个客户获得批准工作流程

客户有不同的审批流程,看看这个:

在我的table“实体”中我有这个

(12, 'Math Andrew', 308, 'CHAIN1-MathAndrew').

这意味着当创建该行时,数字 12 被分配给 Math Andrew...308 是表明 Matt Andrew 是客户的数字

Table type_entities 
(308,'CLIENT'),
(309,'APPROVER1'),
(310,'APPROVER2'),
(311,'APPROVER3'),
(312,'J3 APPROVER4'),
(313,'J4 APPROVER4'),
(314,'J5 APPROVER4'),
(315, 'J6 APPROVER4'),
(316,'J7 APPROVER4');

因为 Math Andrew 是客户(也称为客户),他必须与一个或多个批准者

相关联

一个客户可能有 1 个批准人,或 2 个批准人,或 3 个批准人或 4 个批准人,实体内部存在不同的批准人 table:

(18, 'ZATCH', 309, null),
(19, 'MAX', 309, null),
(20, 'Ger',310, null),
(21, 'Mar',310, null),
(22, 'Maxwell',311, null),
(23, 'Ryan',312, null),
(24, 'Juy',313, null),
(25, 'Angel',314, null),
(26, 'John',315, null);

实体之间的关系类型:

(444,'J6 CLIENT-APPROVER4'),
(445,'J3 CLIENT-APPROVER4'),
(446,'J4 CLIENT-APPROVER4'),
(447,'J10 CLIENT-APPROVER4'),
(448,'J4 CLIENT-APPROVER4'),
(449,'J5 CLIENT-APPROVER4'),
(450,'J10 CLIENT-APPROVER4'),
(451,'J3 CLIENT-APPROVER4'),
(452,'J8 CLIENT-APPROVER4'),
(453,'J5 CLIENT-APPROVER4'),
(454,'J6 CLIENT-APPROVER4'),
(455,'J7 CLIENT-APPROVER4'),
(456,'J7 CLIENT-APPROVER4'),
(457,'J8 CLIENT-APPROVER4'),
(458,'CLIENT-APPROVER3'),
(459,'CLIENT-APPROVER1'),
(460,'APPROVER1-APPROVER2'),
(461,'APPROVER1-APPROVER3'),
(462,'J3 APPROVER1-APPROVER4'),
(463,'APPROVER2-APPROVER3'),
(464,'J3 APPROVER3-APPROVER4'),
(465,'J4 APPROVER3-APPROVER4'),
(466,'J5 APPROVER3-APPROVER4'),
(467,'J6 APPROVER3-APPROVER4'),
(468,'J7 APPROVER3-APPROVER4'),
(469,'J8 APPROVER3-APPROVER4'),
(470,'J10 APPROVER3-APPROVER4'),
(471,'CLIENT-APPROVER2');

这是重要的部分:当一个客户链接到一个批准人时,在 关系 table.

在这种情况下,MathAndrew 链接到审批人 #18 (ZATCH),此行是在分配后创建的:

(787,459,'CHAIN1-MathAndrew',18)--

787 IS THE NUMBER THAT WAS ASSIGNED WHEN THAT ROW WAS CREATED 459

REPRESENTS THE RELATION CLIENT - APPROVER

CHAIN1-MathAndre is the

client 18 is the approver

此外,在这种情况下,APPROVER1 链接到 APPROVER2

(788,460,18,20)

然后,APPROVER2 链接到 APPROVER3

(789,463,20,21)

最后,APPROVER3 链接到 APPROVER4

(790,467,21,26)

我想获得完整的审批工作流程链,我的意思是: CHAIN1-MathAndrew-ZATCH-Ger-Mar-John

我这样做了,但我没有得到我想要的:

WITH relationships_CTE as
select description_entity_1,description_entitiy_2
from relationships
where description_entitiy_1 like 'CHAIN1-MathAndrew'

UNION ALL

select description_entity_1,description_entitiy_2
from relationships
where relationships.description_entitiy_2 = relationships_CTE.description_entitiy_2

select * 
from relationships_CTE ma
left join relationships_CTE na

这是我的 SQL FIDDLE:

http://sqlfiddle.com/#!9/51bb39/4

你能帮帮我吗?

所以你的演示有几个主要问题,首先你试图在不支持它的 MySQL 版本上使用 CTE(CTE 支持是在 MySQL 版本 8),其次,您试图将字符串插入 relationships table 中的列(应该保留为对 entities [=41= 的引用]。更正这些问题后,我们可以查看 CTE。这里有一个语法错误,因为您没有将 CTE 查询包含在 () 中,而且您也没有将 CTE 声明为递归的(因为它引用对自己)。

现在,根据您的问题,您希望从 entities table 中获取名称以对应 relationships table 中的值。因此,我们通过为 CHAIN1-MathAndrew 找到合适的 entities.id 值来启动 CTE,然后在 CTE 的递归部分,我们遍历与该实体相关的所有实体,获取我们去的时候起名字。这给了我们这个查询:

WITH recursive relationships_CTE as (
    select e.id, e.description AS name
    from entities e
    where e.description like 'CHAIN1-MathAndrew'
    UNION ALL
    select r.description_entitiy_2, e.name
    from relationships_CTE cte
    left join relationships r
    on r.description_entitiy_1 = cte.id
    join entities e ON r.description_entitiy_2 = e.id
)

如果我们现在

select *
from relationships_CTE

我们得到

id  name
12  CHAIN1-MathAndrew
18  ZATCH
20  Ger
21  Mar
26  John

或者我们可以使用 GROUP_CONCAT 将这些名称串在一起:

select group_concat(name separator '-')
from relationships_CTE

输出:

CHAIN1-MathAndrew-ZATCH-Ger-Mar-John

Demo on dbfiddle