我有不同的表,目标是获得每个客户的批准工作流
客户具有不同的批准工作流程,请查看以下内容:
在我的表“实体”中,我有这个
(12,'Math Andrew',308,'CHAIN1-MathAndrew')。
这意味着在创建该行时,将数字12分配给了数学安德鲁... 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个批准人,实体表中存在不同的批准人:
(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'); 这是重要的部分:当客户链接到一个批准者时,将在关系表中创建一个关系。
在这种情况下,MathAndrew与批准人#18(ZATCH)相关联,此行在分配后创建:
(787,459,'CHAIN1-MathAndrew',18)---
787是行创建时分配的编号459
代表关系客户-批准人
CHAIN1-MathAndre是
客户端18是批准者
此外,在这种情况下,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
请你帮助我好吗?
问题来源于stack overflow
因此,您的演示存在两个主要问题,首先,您正在尝试在不支持它的MySQL版本上使用CTE(MySQL版本8中引入了CTE支持),其次,您尝试插入在relationships表中的列中添加了一个字符串(应该保留该entities表作为对表的引用。更正了这些问题之后,我们可以查看CTE。此处存在语法错误,因为您没有将CTE查询包含在中(),并且同样,您也未能将CTE声明为递归的(因为它指向自身)。
现在,根据您的问题,您希望从entities表中获取名称以与表中的值相对应relationships。因此,我们CTE通过为找到合适的entities.id值开始CHAIN1-MathAndrew,然后在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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。