source

그래프의 최대 깊이에 대한 MariaDb 쿼리

lovecheck 2023. 8. 15. 11:12
반응형

그래프의 최대 깊이에 대한 MariaDb 쿼리

저는 감독의 관계를 나타내는 재귀적인 표를 가지고 있는데, 한 사람이 많은 사람들을 감독하고 다른 사람들에게 감독을 받을 수 있습니다.

다음은 예제 데이터입니다.

+--------+------------+사람 | 감독 |+--------+------------+|      1 |          2 ||      1 |          3 ||      1 |          4 ||      3 |          5 ||      4 |          5 ||      5 |          8 ||      4 |          6 ||      4 |          7 ||      6 |          9 ||      7 |          9 ||      9 |         10 ||     10 |         11 ||      3 |         11 |+--------+------------+

다음으로 나타낼 수 있습니다. 이 중 색상이 지정된 노드는 최대 깊이의 경로를 나타냅니다.

문제는 경로를 포함하는 행을 반환하는 MariaDb(10.4.1)/Mysql 쿼리를 만드는 것입니다. 이 경우 1, 4, 6, 9, 10, 11 또는 1, 4, 7, 9, 10, 11과 같은 키를 포함하는 행을 반환합니다.

선택...
+------+경로 |+------+|    1 ||    4 ||    6 ||    9 ||   10 ||   11 |+------+

가능한 모든 경로와 깊이를 반환합니다.

with recursive rcte as (
  select person, supervises,
    concat(person, ',', supervises) as path,
    1 as depth
  from graph
  union all
  select r.person, g.supervises,
    concat(r.path, ',', g.supervises),
    r.depth + 1
  from graph g
  join rcte r on r.supervises = g.person
)
select *
from rcte
order by person, supervises

결과:

person | supervises | path          | depth
-------|------------|---------------|------
     1 |          2 | 1,2           | 1
     1 |          3 | 1,3           | 1
     1 |          4 | 1,4           | 1
     1 |          5 | 1,3,5         | 2
     1 |          5 | 1,4,5         | 2
     1 |          6 | 1,4,6         | 2
     1 |          7 | 1,4,7         | 2
     1 |          8 | 1,4,5,8       | 3
     1 |          8 | 1,3,5,8       | 3
     1 |          9 | 1,4,6,9       | 3
     1 |          9 | 1,4,7,9       | 3
     1 |         10 | 1,4,7,9,10    | 4
     1 |         10 | 1,4,6,9,10    | 4
     1 |         11 | 1,4,6,9,10,11 | 5
     1 |         11 | 1,3,11        | 2
     1 |         11 | 1,4,7,9,10,11 | 5
     3 |          5 | 3,5           | 1
     3 |          8 | 3,5,8         | 2
     3 |         11 | 3,11          | 1
     4 |          5 | 4,5           | 1
     4 |          6 | 4,6           | 1
     4 |          7 | 4,7           | 1
     4 |          8 | 4,5,8         | 2
     4 |          9 | 4,6,9         | 2
     4 |          9 | 4,7,9         | 2
     4 |         10 | 4,6,9,10      | 3
     4 |         10 | 4,7,9,10      | 3
     4 |         11 | 4,6,9,10,11   | 4
     4 |         11 | 4,7,9,10,11   | 4
     5 |          8 | 5,8           | 1
     6 |          9 | 6,9           | 1
     6 |         10 | 6,9,10        | 2
     6 |         11 | 6,9,10,11     | 3
     7 |          9 | 7,9           | 1
     7 |         10 | 7,9,10        | 2
     7 |         11 | 7,9,10,11     | 3
     9 |         10 | 9,10          | 1
     9 |         11 | 9,10,11       | 2
    10 |         11 | 10,11         | 1

데모

최대 깊이를 얻으려면 다음을 사용합니다.

select max(depth) from rcte

언급URL : https://stackoverflow.com/questions/55442382/mariadb-query-for-max-depth-in-graph

반응형