lundi 15 juin 2015

Getting paths between records using SQL?

This SQLFiddle example describes 2 tables and their relationship:

  1. Primary Routes: A direct route between 2 places. Indirect primary routes are for relationship purposes with the secondary routes table

  2. 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:

  1. 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.

  1. 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:

  1. London-Sheering: No route from 1 and 2 above fits. However, routes exist between London->Harlow and Harlow-Sheering.

  2. 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.

Aucun commentaire:

Enregistrer un commentaire