sql >> データベース >  >> RDS >> Mysql

ソースと宛先の間のホップ数を計算する方法は?

    MySQL 8.0を実行している場合は、再帰クエリを使用してこれを行うことができます:

    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)
    

    再帰クエリのアンカーは、着信リンクを持たないノードです。次に、元のノードとホップ数を追跡しながら、各パスをウォークします。最後に、外部クエリはパスごとに最後のノードでフィルタリングします。

    DBフィドルのデモ

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



    1. AWSGlueでMySQLテーブルを上書きする

    2. 最大値のみを含むsql/mysqlフィルター

    3. SQLコマンドはどのように分類されますか| UBIQ

    4. PHPMySQL複数の列による順序