This SQLFiddle example describes 2 tables and their relationship:
Primary Routes: A direct route between 2 places. Indirect primary routes are for relationship purposes with the secondary routes table
Secondary Routes: A route between 2 places where no direct primary route exists
Now, a user wants to go from one place to another. So, for this example, a user selects the following points:
- London->Harlow:
A direct route exists. The SQL is simple:
SELECT *
FROM primary_routes
WHERE
(
(point1 = 'London' AND point2 = 'Harlow')
OR (point1 = 'Harlow' AND point2 = 'London')
)
AND direct = 1
A route is only entered once in the DB, however a route goes both ways.
- Stanmore->Waltham:
No direct route exists, however both these points lie on the same route. The SQL is:
SELECT DISTINCT primary_id
FROM secondary_routes
WHERE point IN ( 'Stanmore', 'Waltham')
Now, the complexity will increase because there might be other kinds of connections, for example:
London-Sheering: No route from 1 and 2 above fits. However, routes exist between London->Harlow and Harlow-Sheering.
Wembley-Shenley: No route from 1, 2, or 3 fits. However, routes exist between Wembley->London->Watford->Shenley, or Wembley->London->Harlow->Shenley
Is it possible to build a (not so complex) SQL statement that will return the routes for 3 and 4, and furthermore, for each route found (including in 2), the distance between the 2 points must be calculated and be part of the route.
In a word, no, there is no simple SQL query given your data structure that would easily find those routes.
You would probably be better off pre-calculating those routes and distances and populating those into a third table. e.g. StartPoint, EndPoint, TransferPoint, ToTransfer_Primary_id, FromTransfer_PrimaryID2, Distance.
You would have to build it up in stages.
For example for London -> Harlow you can use the primary routes
Which gives you
Then you would have to write a query to test for a transfer point at one of the secondary routes.