Nếu bạn đang chạy MySQL 8.0, bạn có thể thực hiện việc này bằng truy vấn đệ quy:
with recursive cte as (
select source, delivery, 1 hops
from mytable t
where not exists (select 1 from mytable t1 where t1.delivery = t.source)
union all
select c.source, t.delivery, c.hops + 1
from cte c
inner join mytable t on t.source = c.delivery
)
select source, delivery, hops
from cte c
where hops = (select max(c1.hops) from cte c1 where c1.source = c.source)
Neo của truy vấn đệ quy là các nút không có liên kết đến; sau đó, nó đi từng con đường, đồng thời theo dõi các nút ban đầu và số lượng bước nhảy. Cuối cùng, truy vấn bên ngoài lọc trên nút cuối cùng trên mỗi đường dẫn.
Bản trình diễn trên DB Fiddle :
nguồnsource | delivery | hops :----- | :------- | ---: s1 | f1 | 3 s2 | f2 | 4