paso 0:Cree una vista que muestre todos los pares de vecinos
CREATE VIEW neighbour AS
( SELECT loc1.id AS a
, loc2.id AS b
FROM locations loc1
, locations loc2
WHERE FIND_IN_SET(loc1.id, loc2.neighbours)>0
OR FIND_IN_SET(loc2.id, loc1.neighbours)>0
) ;
paso 1:encontrar vecinos de profundidad 1
SELECT b AS depth1
FROM neighbour
WHERE a = 1; <-- for root with id=1
paso 2:encontrar vecinos de profundidad 2
SELECT DISTINCT d2.b AS depth2
FROM neighbour d1
JOIN neighbour d2
ON d1.b = d2.a
AND d2.b != 1
WHERE d1.a = 1 <-- for root with id=1
AND d2.b NOT IN
( SELECT b AS depth1 <- depth1 subquery
FROM neighbour
WHERE a = 1 <-- for root with id=1
)
;
paso 3:encontrar vecinos de profundidad 3
SELECT d3.b as depth3
FROM neighbour d1
JOIN neighbour d2
ON d1.b = d2.a
AND d2.b != 1
AND d2.b NOT IN
( SELECT b as depth1
FROM neighbour
WHERE a = 1
)
JOIN neighbour d3
ON d2.b = d3.a
AND d3.b != 1
WHERE d1.a = 1
AND d3.b NOT IN
( SELECT b as depth1
FROM neighbour
WHERE a = 1
)
AND d3.b NOT IN
( SELECT d2.b AS depth2
FROM neighbour d1
JOIN neighbour d2
ON d1.b = d2.a
AND d2.b != 1
WHERE d1.a = 1
AND d2.b NOT IN
( SELECT b AS depth1
FROM neighbour
WHERE a = 1
)
)
;
Como puede ver, el crecimiento es exponencial para la cantidad de líneas de consulta, por lo que no probaré el nivel 4.