此SQLFiddle example描述了2个表及其关系:
主要路线:2个地方之间的直接路线。间接主路由用于与次路由表
次要路线:在没有直接主要路线的2个地方之间的路线
现在,用户想要从一个地方到另一个地方。因此,对于此示例,用户选择以下几点:
存在直接路线。 SQL很简单:
SELECT *
FROM primary_routes
WHERE
(
(point1 = 'London' AND point2 = 'Harlow')
OR (point1 = 'Harlow' AND point2 = 'London')
)
AND direct = 1
路由只在数据库中输入一次,但路由是双向的。
没有直接路线,但这两点都在同一条路线上。 SQL是:
SELECT DISTINCT primary_id
FROM secondary_routes
WHERE point IN ( 'Stanmore', 'Waltham')
现在,复杂性将增加,因为可能存在其他类型的连接,例如:
伦敦Sheering: 上面的1和2没有路线适合。但是,伦敦 - > Harlow和Harlow-Sheering之间存在路线。
布利-Shenley: 没有来自1,2或3的路线。然而,路线存在于温布利 - 伦敦 - >沃特福德 - >申利,或温布利 - >伦敦 - >哈洛 - >申利
是否可以构建一个(不那么复杂的)SQL语句,它将返回3和4的路由,此外,对于找到的每个路由(包括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%'