sql >> Database teknologi >  >> RDS >> Mysql

Hvordan beregner man antallet af hop mellem kilden og destinationen?

Hvis du kører MySQL 8.0, kan du gøre dette med en rekursiv forespørgsel:

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)
 

Ankeret for den rekursive forespørgsel er noder, der ikke har noget indgående link; derefter går den hver vej, mens den holder styr på de oprindelige knudepunkter og antallet af hop. Til sidst filtrerer den ydre forespørgsel på den sidste node pr. sti.

Demo på DB Fiddle :

kilde | levering | humle:----- | :------- | ---:s1 | f1 | 3s2 | f2 | 4


  1. SYSDATETIME() Eksempler i SQL Server (T-SQL)

  2. Risiko ved brug af dynamisk hukommelse i Hyper-V

  3. Opret en database i SQL Server 2017

  4. Sammenkæd flere rækker i et array med SQL på PostgreSQL