Comments - Recursive Common Table Expressions Overview

5 years, 9 months ago Jon Armstrong

From the documentation above, I've added n to indicate the level within the hierarchy:

CREATE TABLE bus_routes (origin varchar(50), dst varchar(50));
INSERT INTO bus_routes VALUES
  ('New York', 'Boston'),
  ('Boston', 'New York'),
  ('New York', 'Washington'),
  ('Washington', 'Boston'),
  ('Washington', 'Raleigh')
;

WITH RECURSIVE paths (n, cur_path, cur_dest) AS (
    SELECT 1 AS n, origin, origin FROM bus_routes WHERE origin='New York' 
     UNION
    SELECT n + 1
         , CONCAT(paths.cur_path, ',', bus_routes.dst)
         , bus_routes.dst 
      FROM paths, bus_routes 
     WHERE paths.cur_dest = bus_routes.origin
       AND LOCATE(bus_routes.dst, paths.cur_path) = 0 
) 
SELECT * FROM paths
;
 
5 years, 9 months ago Jon Armstrong

The result:

+---+-----------------------------+------------+
| n | cur_path                    | cur_dest   |
+---+-----------------------------+------------+
| 1 | New York                    | New York   |
| 2 | New York,Boston             | Boston     |
| 2 | New York,Washington         | Washington |
| 3 | New York,Washington,Boston  | Boston     |
| 3 | New York,Washington,Raleigh | Raleigh    |
+---+-----------------------------+------------+
 
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.