Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie berechnet man die Anzahl der Sprünge zwischen Quelle und Ziel?

Wenn Sie MySQL 8.0 ausführen, können Sie dies mit einer rekursiven Abfrage tun:

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)

Der Anker der rekursiven Abfrage sind Knoten, die keinen eingehenden Link haben; dann geht es jeden Pfad ab, während es die ursprünglichen Knoten und die Anzahl der Sprünge verfolgt. Schließlich filtert die äußere Abfrage nach dem letzten Knoten pro Pfad.

Demo auf DB Fiddle :

source | delivery | hops
:----- | :------- | ---:
s1     | f1       |    3
s2     | f2       |    4