sql >> Database >  >> RDS >> Mysql

Hoe het aantal hops tussen bron en bestemming berekenen?

Als u MySQL 8.0 gebruikt, kunt u dit doen met een recursieve query:

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)

Het anker van de recursieve query zijn knooppunten die geen inkomende link hebben; vervolgens loopt het elk pad, terwijl het de oorspronkelijke knooppunten en het aantal hops bijhoudt. Ten slotte filtert de buitenste query op het laatste knooppunt per pad.

Demo op DB Fiddle :

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



  1. Hoe MySQL Strikte Modus uit te schakelen

  2. 'IF' in 'SELECT'-statement - kies uitvoerwaarde op basis van kolomwaarden

  3. Opgeslagen procedure om de status van indexen in alle databases te krijgen

  4. Hiaten in mysql-tabelrij-ID repareren nadat we er enkele hebben verwijderd