Solo para informarle, estas soluciones se basan en comparaciones de cadenas, no están optimizadas y no pueden usar índices. debería considerar normalizar sus tablas de manera diferente. (Consulte Administración de datos jerárquicos en MySQL )
Con respecto a algunas de las preguntas:
Seleccione todos los niños de id 9:
Desde la Path
columna no incluye las barras diagonales iniciales y finales, debe concatenarlas en la ruta:
SELECT *
FROM tester
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
seleccione un conteo agregado de 9 hijos, x niveles de profundidad:
Necesitamos agrupar por el número de barras en la ruta, menos el número de barras en la ruta principal:
SELECT (LENGTH(c.Path) - LENGTH(REPLACE(c.Path, '/', '')))
- (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))) AS Level,
COUNT(*)
FROM tester c
JOIN tester p ON c.Parent = p.ID
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
GROUP BY 1
Para simplificar, utilicé la consulta anterior para mostrar todos los niveles. Si desea limitar x niveles de profundidad, use WHERE
predicado de la consulta a continuación.
seleccione las identificaciones de los niños de 9 hasta x niveles, con el nivel relativo a 9:
Buscamos el Path
columna hasta un número x de niveles, teniendo en cuenta el nivel de los padres:
SELECT c.*
FROM tester c
JOIN tester p ON c.Parent = p.ID
WHERE CONCAT(
'/',
SUBSTRING_INDEX(
Path,
'/',
(LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))) + 4
),
'/') LIKE '%/9/%'
Los pasos que estamos tomando:
- Necesitamos averiguar qué tan profundo es el padre, podemos encontrarlo contando las barras en la ruta del padre. (
LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))
) - Necesitamos agregar 1 a ese número, ya que una ruta con 1 barra inclinada tiene 2 niveles de profundidad.
- Añadimos la x cantidad de niveles deseados.
- Tome la columna de la ruta hasta el total del nivel (utilice
SUBSTRING_INDEX
función). - Agregue la barra inclinada inicial y final.
- Buscar la cadena final para 9.