递归 - 在 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
我有不同的 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