Mysql SQL按路由排序信息

Mysql SQL按路由排序信息,mysql,sql,Mysql,Sql,Ik有一个包含随机顺序的路由信息的表,如下所示: from to street ---------------------------------- 92 91 Lange Poten 100 104 Bagijnestraat 85 79 Korte Poten 91 85 Plein 79 100 Bezuidenhoutseweg 我试图找到一种使用路由信息对其进行排序的方法,其

Ik有一个包含随机顺序的路由信息的表,如下所示:

from    to      street
----------------------------------
92      91      Lange Poten
100     104     Bagijnestraat
85      79      Korte Poten
91      85      Plein
79      100     Bezuidenhoutseweg
我试图找到一种使用路由信息对其进行排序的方法,其中当前行的to列与下一行的from列匹配。在本例中,我想要的顺序是:

from    to      street
----------------------------------
92      91      Lange Poten
91      85      Plein
85      79      Korte Poten
79      100     Bezuidenhoutseweg
100     104     Bagijnestraat
fromto列上的简单排序方式不起作用,因为数字顺序不正确。我正在尝试使用SQL或Excel查找方法

SQL Fiddle here:

这在oracle中有效 SQL Server(2005+将是

Declare @Routes Table([from] int, [to] int, [street] varchar(17))   
INSERT INTO @Routes VALUES
(92, 91, 'Lange Poten'),
(100, 104, 'Bagijnestraat'),
(85, 79, 'Korte Poten'),
(91, 85, 'Plein'),
(79, 100, 'Bezuidenhoutseweg')

;With  Cte AS
(
    SELECT  [from]
            ,[to]
            ,[street]
    FROM    @Routes
    WHERE   [from] = 92
    UNION ALL
    SELECT  r.[from]
            ,r.[to]
            ,r. [street]
FROM    @Routes AS r
JOIN    Cte c
ON      c.[to] = r.[from]
)

Select * From Cte

每条路由最多有50行,因此没有性能限制。我对不使用SQL的解决方案持开放态度。这本质上是一个图遍历问题。关于图形及其相关算法(遍历、搜索、最佳路径等),有许多资源和操作指南。我在SQL中发现了一个非常好的,它相当长,但它可能会给你一些提示:@OttoCoster:这是为哪个数据库设计的?@MarkByers根据他发布的SQL FIDLE,它是MySQL-我添加了标签。我使用的是MySQL,但不限于特定的数据库。Oracle中的解决方案似乎很好,所以我很高兴使用它。谢谢,它是从一个设定的起点开始工作的:
Declare @Routes Table([from] int, [to] int, [street] varchar(17))   
INSERT INTO @Routes VALUES
(92, 91, 'Lange Poten'),
(100, 104, 'Bagijnestraat'),
(85, 79, 'Korte Poten'),
(91, 85, 'Plein'),
(79, 100, 'Bezuidenhoutseweg')

;With  Cte AS
(
    SELECT  [from]
            ,[to]
            ,[street]
    FROM    @Routes
    WHERE   [from] = 92
    UNION ALL
    SELECT  r.[from]
            ,r.[to]
            ,r. [street]
FROM    @Routes AS r
JOIN    Cte c
ON      c.[to] = r.[from]
)

Select * From Cte