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

¿Existe una alternativa `conectar por` en MySQL?

Como se dijo en los comentarios, no hay un camino corto con mysql.

¡PERO!

Si tiene la posibilidad de cambiar la estructura de la base de datos, puede implementar un mejor diseño para manejar jerarquías en forma de árbol.

Si sigue ESTE TUTORIAL de Bill Karwin (AQUÍ es la respuesta original que hace referencia a ese tutorial de presentación de diapositivas), puede encontrar 4 métodos utilizados para modelar una estructura jerárquica:

  1. Lista de adiacencia
  2. Enumeración de ruta
  3. Conjuntos anidados
  4. Mesa de cierre

Ahora, el mejor modelo posible es el 4to (dejo las descripciones de los otros 3 modelos al lector), que básicamente necesita 2 tablas:una para los elementos y otra para los caminos. En la tabla de rutas (la tabla de cierre en sí), almacenará cada ruta desde cada nodo hasta cada descendiente (¡no solo los hijos directos!).

Se sugiere guardar también la longitud de la ruta para cada fila, ya que facilita la consulta de los hijos inmediatos en el árbol.

Incluso si esta solución requiere más espacio, tiene el mejor rendimiento general y es realmente fácil de usar:¡no se basa en consultas recursivas en absoluto Y otorgará integridad referencial para todo el conjunto de datos!

Por ejemplo, para obtener todos los hijos del nodo #4:

select a.*
from nodes a
join paths b
on a.node_id = b.descendant
where b.ancestor = 4

Otro ejemplo:obtener todos los ancestros del nodo #11

select a.*
from nodes a
join paths b
on a.node_id = b.ancestor
where b.descendant = 11

necesita borrar el subárbol del nodo #6

delete from paths where descendant in
(select descendant from paths where ancestor = 6)