sql >> Base de Datos >  >> RDS >> Mysql

Selección basada en la ruta en mysql

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:

  1. 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, '/', '')) )
  2. Necesitamos agregar 1 a ese número, ya que una ruta con 1 barra inclinada tiene 2 niveles de profundidad.
  3. Añadimos la x cantidad de niveles deseados.
  4. Tome la columna de la ruta hasta el total del nivel (utilice SUBSTRING_INDEX función).
  5. Agregue la barra inclinada inicial y final.
  6. Buscar la cadena final para 9.