我有不同的表,目标是获得每个客户的批准工作流,并以这种方式显示该信息:
>客户|批准人1 |批准人2 |批准人3 |批准人4
首先,我有一个名为entities的表

(12, 'Math Andrew', 308, 'CHAIN1-MathAndrew')
(13, 'John Connor', 308, 'CHAIN2-JohnConnor')
(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);

请注意:
12个被分配给数学安德鲁。。。308是那个数字
马特·安德鲁是客户
13号被分配给约翰·康纳。。。308是那个数字
约翰·康纳是客户
因为Math Andrew和John Connor是客户(也称为客户),所以它们必须链接到一个或多个审批者
客户端可以有1个批准者,或者2个批准者或3个批准者或4个批准者,实体表中存在不同的批准者。
当我说一个客户“可能有”一个或多个批准人时,我的意思是
客户端-APPROVER4(这是1-1关系)PS:客户端将
总是以某种方式与APPROVER4相关
客户端-APPROVER1-APPROVER4(在本例中,将有2个
关系。。一个:客户-批准人1和另一个批准人1-批准人4)
客户端-APPROVER1-APPROVER2-APPROVER4(在这种情况下
3关系。。一个:CLIENT-APPROVER1、APPROVER1-APPROVER2和
批准人2-批准人4)
等等。。。(希望你能明白)
表类型实体
(308,'CLIENT'),
(309,'APPROVER1'),
(310,'APPROVER2'),
(311,'APPROVER3'),
(312,'J3 APPROVER4'),
(313,'J4 APPROVER4'),
(314,'J5 APPROVER4'),
(315, 'J6 APPROVER4'),
(316,'J7 APPROVER4');

表类型关系
(444,'J6 CLIENT-APPROVER4'),
(445,'J3 CLIENT-APPROVER4'),
(446,'J4 CLIENT-APPROVER4'),
(447,'J10 CLIENT-APPROVER4'),
(449,'J5 CLIENT-APPROVER4'),
(453,'J5 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');

关系类型:
客户-批准人1:(459,“客户-批准人1”)
客户-批准人2:(471,“客户-批准人2”)
客户端-APPROVER3:(461,'APPROVER1-APPROVER3')
客户-批准人4:
(445,“J3客户-批准人4”)
(446,“J4客户-批准人4”)
(449,“J5客户-批准人4”)
(444,“J6客户-批准人4”)
(456,“J7客户-批准人4”)
(457,“J8客户-批准人4”)
(447,“J10客户-批准人4”)
批准人1-批准人2:
(460,'APPROVER1-APPROVER2')
批准人2-批准人3:
(463,'APPROVER2-APPROVER3')
批准人3-批准人4:
(464,“J3批准人3-批准人4”)
(465,“J4批准人3-批准人4”)
(466,“J5批准人3-批准人4”)
(467,“J6批准人3-批准人4”)
(468,“J7批准人3-批准人4”)
(469,“J8批准人3-批准人4”)
(470,“J10批准人3-批准人4”)
这一点很重要:当一个客户链接到一个审批者时,一个新的
关系是在关系表中创建的。
表关系:
(787,459,12,18)
(788,460,18,20)
(789,463,20,21)
(790,467,21,26)

787是创建该行时分配的编号
459表示关系:CLIENT-APPROVER
CHAIN1 Mathande是客户
18是批准人
遵循这一理念:
APPROVER1已链接到APPROVER2
(788460、18、20)
APPROVER2已链接到APPROVER3
(789463,20,21)
APPROVER3已链接到APPROVER4
(790467、21、26)

所以,我想在屏幕上显示这个:
|CLIENT               | APPROVER1 | APPROVER2 | APPROVER3 | APPROVER4|
|CHAIN1-MathAndrew    |   ZATCH   |   Ger     |    Mar    |    John  |
|CHAIN2-JohnConnor    |    MAX    |           |    Mario  |    Steven|
|CHAIN3-MarioShapiro  |    IVAN   |           |           |    John  |

最后两行只是一个例子
这就是我目前所拥有的(它正在发挥作用):
LINK_sample_SQL
但它显示的信息没有显示列名称(CLIENT、APPROVER1、APPROVER2、APPROVER3、APPROVER4)。。这显示了:
连锁店1 Matharew ZATCH Ger Mar John
我想以这种方式显示数据:
|CLIENT               | APPROVER1 | APPROVER2 | APPROVER3 | APPROVER4|
|CHAIN1-MathAndrew    |   ZATCH   |   Ger     |    Mar    |    John  |
|CHAIN2-JohnConnor    |    MAX    |           |    Mario  |    Steven|
|CHAIN3-MarioShapiro  |    IVAN   |           |           |    John  |

我迷路了,你能帮帮我吗?
编辑:
最大批准金额为:4

最佳答案

您应该根据需要使用条件聚合来格式化数据。请尝试以下解决方案,我假设您有MySQL版本8,并且窗口函数可用:

WITH recursive relationships_CTE as (
  select e.id, e.description AS name, 1 col_id,
    row_number() over (order by e.id) row_id
  from entities e
  where e.description like 'CHAIN%'
    UNION ALL
  select r.description_entitiy_2, e.name, col_id+ 1, row_id
  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
  max(case when col_id = 1 then name end) client,
  max(case when col_id = 2 then name end) approver1,
  max(case when col_id = 3 then name end) approver2,
  max(case when col_id = 4 then name end) approver3,
  max(case when col_id = 5 then name end) approver4
from relationships_CTE
group by row_id

DB-FIDDLE DEMO
该解决方案使用您的SQL查询并添加表格式化所需的信息:(1)行id和(2)列id。然后在条件聚合中使用这些值来创建表。

关于mysql - 试图获取准确的信息(CTE-递归),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58907969/

10-11 20:33