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 供大家参考吧