使用SQL获取记录之间的路径?

时间:2015-06-16 01:15:47

标签: sql sqlite android-sqlite

SQLFiddle example描述了2个表及其关系:

  1. 主要路线:2个地方之间的直接路线。间接主路由用于与次路由表

  2. 的关系
  3. 次要路线:在没有直接主要路线的2个地方之间的路线

  4. 现在,用户想要从一个地方到另一个地方。因此,对于此示例,用户选择以下几点:

    1. 伦敦 - > Harlow:
    2. 存在直接路线。 SQL很简单:

      SELECT * 
      FROM primary_routes 
      WHERE 
          (
              (point1 = 'London' AND point2 = 'Harlow') 
              OR (point1 = 'Harlow' AND point2 = 'London')
          ) 
          AND direct = 1 
      

      路由只在数据库中输入一次,但路由是双向的。

      1. Stanmore-> Waltham:
      2. 没有直接路线,但这两点都在同一条路线上。 SQL是:

        SELECT DISTINCT primary_id 
        FROM secondary_routes 
        WHERE point IN ( 'Stanmore', 'Waltham')
        

        现在,复杂性将增加,因为可能存在其他类型的连接,例如:

        1. 伦敦Sheering: 上面的1和2没有路线适合。但是,伦敦 - > Harlow和Harlow-Sheering之间存在路线。

        2. 布利-Shenley: 没有来自1,2或3的路线。然而,路线存在于温布利 - 伦敦 - >沃特福德 - >申利,或温布利 - >伦敦 - >哈洛 - >申利

        3. 之间

          是否可以构建一个(不那么复杂的)SQL语句,它将返回3和4的路由,此外,对于找到的每个路由(包括2),必须计算2个点之间的距离,并且路线的一部分。

2 个答案:

答案 0 :(得分:0)

总之,不,没有简单 SQL查询,因为您的数据结构很容易找到这些路径。

你可能最好先预先计算这些路线和距离,然后将它们填入第三张桌子。例如StartPoint,EndPoint,TransferPoint,ToTransfer_Primary_id,FromTransfer_PrimaryID2,距离。

你必须分阶段建立它。

例如伦敦 - >哈洛你可以使用主要路线

select firstroute.point1 as startpoint, firstroute.id as ToTransfer_Primary_id, firstroute.point2 as transferpoint, secondroute.id as FromTransfer_Primary_id , secondroute.point2 as endpoint
from primary_routes as firstroute
inner join primary_routes as secondroute on secondroute.point1 = firstroute.point2
WHERE firstroute.point1 = 'London'
AND secondroute.point2 = 'Harlow'

哪个给你

startpoint  ToTransfer_Primary_id   transferpoint   FromTransfer_Primary_id endpoint
London      2                       Watford         4                       Harlow

然后你必须编写一个查询来测试其中一个辅助路由的传输点。

答案 1 :(得分:0)

我没有看到您发布的链接中的直接路线距离(您需要计算总距离),但是您可以比较表格的两个副本中的点数,无论a.point1是什么,都可以加入和b.point2一样 这两者有一个共同点a.point2 = b.point1

select 
   a.point1 as startpoint,
   b.point2 as endpoint, 
   a.point2 as midpoint,
from primary_routes a
join primary_routes as b on b.point1=a.point2   
where a.point1 like '%London%'
    and
    b.point2 like '%Harlow%'