WITH RECURSIVE temp as (
select
caller_service_id
,s1.service_name as s1_name
,callee_service_id
,s2.service_name as s2_name
,first_call_date
from service_dependencies s_d left join services s1 on s_d.caller_service_id = s1.service_id
left join services s2 on s_d.callee_service_id = s2.service_id
where first_call_date like '2025-%'
),
dependency as (
select
caller_service_id
,s1_name
,1 as dependency_depth
,concat( 'Payment_Gateway', '->', temp.s1_name ) as dependency_path
from temp
where temp.s2_name = 'Payment_Gateway'
union all
select
temp.caller_service_id
,temp.s1_name
,dp.dependency_depth + 1 as dependency_depth
,concat( dependency_path, '->', temp.s1_name ) as dependency_path
from dependency as dp join temp on dp.caller_service_id = temp.callee_service_id
where find_in_set( temp.s1_name, dependency_path) = 0
)
select
caller_service_id as service_id
,s1_name as service_name
,dependency_depth
,dependency_path
from dependency
order by dependency_depth asc, service_id asc, dependency_path asc;
其实个人感觉这题不太严谨,没有考虑服务循环调用的情况,所以我自作聪明补充了一句where find_in_set( temp.s1_name, dependency_path) = 0 供大家参考吧



京公网安备 11010502036488号