Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 试图获得准确信息(CTE-递归)_Mysql_Sql_Common Table Expression_Recursive Query - Fatal编程技术网

Mysql 试图获得准确信息(CTE-递归)

Mysql 试图获得准确信息(CTE-递归),mysql,sql,common-table-expression,recursive-query,Mysql,Sql,Common Table Expression,Recursive Query,我有不同的表,的目标是为每个客户获得批准工作流,并以以下方式显示该信息: |CLIENT | APPROVER1 | APPROVER2 | APPROVER3 | APPROVER4| |CHAIN1-MathAndrew | ZATCH | Ger | Mar | John | |CHAIN2-JohnConnor | MAX | | Mario | Steven|

我有不同的表,的目标是为每个客户获得批准工作流,并以以下方式显示该信息:

|CLIENT               | APPROVER1 | APPROVER2 | APPROVER3 | APPROVER4|
|CHAIN1-MathAndrew    |   ZATCH   |   Ger     |    Mar    |    John  |
|CHAIN2-JohnConnor    |    MAX    |           |    Mario  |    Steven|
|CHAIN3-MarioShapiro  |    IVAN   |           |           |    John  |
>客户|审批人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);
请注意:

(308,'CLIENT'),
(309,'APPROVER1'),
(310,'APPROVER2'),
(311,'APPROVER3'),
(312,'J3 APPROVER4'),
(313,'J4 APPROVER4'),
(314,'J5 APPROVER4'),
(315, 'J6 APPROVER4'),
(316,'J7 APPROVER4');
12被分配给数学安德鲁。。。308是这个数字 马特·安德鲁是一位客户

13号被分配给约翰·康纳。。。308是这个数字 约翰·康纳是一位客户

因为Math Andrew和John Connor是客户(也称为客户),所以他们必须与一个或多个审批人链接

一个客户端可以有1个审批人,或2个审批人,或3个审批人或4个审批人,但实体表中存在不同的审批人

当我说一个客户“可能有”一个或多个批准人时,我的意思是

客户-批准人4(这是1-1关系)PS:客户将 始终以某种方式与审批人4相关

客户端-审批人1-审批人4(在这种情况下,将有2个 关系..一个:客户端-审批人1和另一个审批人1-审批人4)

客户端-审批人1-审批人2-审批人4(在这种情况下 3关系..一:客户端-审批人1、审批人1-审批人2和 批准人2-批准人4)

等等。。。(希望你能明白)

表格类型\u实体

(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');

关系类型:

(308,'CLIENT'),
(309,'APPROVER1'),
(310,'APPROVER2'),
(311,'APPROVER3'),
(312,'J3 APPROVER4'),
(313,'J4 APPROVER4'),
(314,'J5 APPROVER4'),
(315, 'J6 APPROVER4'),
(316,'J7 APPROVER4');
客户-审批人1:(459,“客户-审批人1”)

客户-审批人2:(471,“客户-审批人2”)

客户-审批人3:(461,“审批人1-审批人3”)

客户-审批人4:

(308,'CLIENT'),
(309,'APPROVER1'),
(310,'APPROVER2'),
(311,'APPROVER3'),
(312,'J3 APPROVER4'),
(313,'J4 APPROVER4'),
(314,'J5 APPROVER4'),
(315, 'J6 APPROVER4'),
(316,'J7 APPROVER4');
(445,“J3客户批准人4”)

(446,“J4客户批准人4”)

(449,“J5客户批准人4”)

(444,“J6客户批准人4”)

(456,“J7客户批准人4”)

(457,“J8客户批准人4”)

(447,“J10客户批准人4”)

批准人1-批准人2:

(787,459,12,18)
(788,460,18,20)
(789,463,20,21)
(790,467,21,26)
(460,'APPROVER1-APPROVER2')

批准人2-批准人3:

(787,459,12,18)
(788,460,18,20)
(789,463,20,21)
(790,467,21,26)
(463,'APPROVER2-APPROVER3')

批准人3-批准人4:

(787,459,12,18)
(788,460,18,20)
(789,463,20,21)
(790,467,21,26)
(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表示关系:客户-审批人
Chain 1 MathAndre是客户
18是批准人

按照这个想法:

审批人1已链接到审批人2

(788460,18,20)

APPROVER2已链接到APPROVER3

(789463,20,21)

APPROVER3已链接到APPROVER4

(790467,21,26) ​

所以,我想在屏幕上显示这个:

(787,459,12,18)
(788,460,18,20)
(789,463,20,21)
(790,467,21,26)
最后两行只是一个示例


这就是我目前所拥有的(它正在发挥作用):

但它在显示信息时没有显示列名称(客户端、审批人1、审批人2、审批人3、审批人4)。。这将显示以下内容:

1号连锁店:安德鲁·扎奇·格马尔·约翰

我希望以以下方式显示数据:

|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


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

谢谢您的回复!。我正在检查这个问题,你能给我解释一下这个查询是如何工作的吗?老兄,你能看一下这个问题吗:这是一个非常棘手的问题。当链中的审批人少于4人时,这个查询不能正常工作,例如链变成
CLIENT-APPROVER3-APPROVER4