Sucios trucos, hoy recorrer un árbol jerárquico.
Muy buenas,
Este no es tan sucio truco como el del switch, pero también vale su peso en oro. Seguro que alguien ya se lo sabe, pero seguro que hay más gente que no. Al lío.
Situación:
Hay que representar en una bd una estructura jerárquica de carpetas. Lo que yo pensé en su día, era crear un campo para cada carpeta en el que se indicara cual era su "parent" o padre. De esa forma, si el parent != 0, quiere decir que la carpeta está dentro de otra.
Ahora suponed que alguien accede directamente a una carpeta en el nivel 18. La teoría es muy sencilla, te metes en un bucle a buscando el parent y cuando sea 0 te paras, has recorrido el arbol completo.
El método es fácil pero lo podríamos incluir dentro de la categoría furry. Son muchas consultas la base, muy poco optimizado.
Bueno, pues preguntando en Foros del Web, me llevaron a la siguiente página:
Storing Hierarchical Data in a Database
Se trata de una solución de gafotas que mola muchisimo. No os la pongo porque es mucho más fácil de entender gráficamente.
En la página se dan dos soluciones al problema, una la que os acabo de peyotear y otra la molona, o sea que podéis empezar a leer donde pone Modified Preorder Tree Traversal.
Pues espero que os ayude en alguna faceta de vuestra vida. Yo espero mostraros dentro de poco un caso práctico de esto.
A disfrutarlo!
mik
Efectivamente Zárate. Tu presidias la mesa y yo quedaba a tu derecha. Pedazo de comilona! :shock: (aunque todo fueran verduritas)
Efectivamente de nuevo, a mi también me pasa. Tengo delante una hoja con media hora de flechas y números como prólogo al gran descubrimiento de la columna parent. Cuando te das de frente contra algo no hay nada mejor que empezar de cero y repasarlo todo desde el principio. O postear en domestika y repartir los cabezazos contra el muro entre varios, que cuantas más cabezas, antes caerá el muro.
Y yo contento de haberte podido ayudar. Además, me ha flipao el metodo este para almacenar estructuras jerárquicas. ¿Como cojones se le habrá ocurrido?Hay gente que discurre demasiado (y yo que me alegro).
Un abrazo!
juandelgado
O_O O_O O_O O_O O_O O_O
Menos mal que hay alguien que tiene ojos.... es que hay veces que te pones con algo tanto, tanto,que no eres capaz de ver lo más obvio (por favor que alguien diga: "A mi tembién me pasa", o si no quedaré como un poco juvenil).
Muchas gracias Miguel tío, te debo una.
PD: ¿Tú eres el programador de Inklude? Creo estuvimos cenando juntos el sábado en el Fresc Co. Pon una foto tuya por ahí y te lo confirmo. Un saludo!
mik
Zárate
La única relación que encuentro entre los hijos de un mismo nodo, es que el valor de la derecha del hijo de la izquierda es el anterior al valor de la izquierda del siguiente hijo de la derecha.... ya, yo lo he tenido que leer un par de veces para asegurarme que lo ponía bien : ) Pero que en el gráfico se ve muy fácil
De todas formas, ¿cómo se plasma eso en una consulta?
¬_¬
Te has obcecado con los campos lft y rgt y la tabla del ejemplo contiene más información. Hay una relación mucho más sencilla entre los hijos de un mismo nodo: todos tienen el mismo valor para la columna PARENT.
SELECT * FROM tree WHERE parent=$root ORDER BY lft ASC LIMIT n
Lo que ya sería más complicado es extraer todos los nodos descendientes de esos n nodos hijos en una sola consulta (siempre se pueden hacer n consultas con los valores de lft y rgt de los n nodos extraidos) aunque no se si era eso lo que quierias o con los n nodos hijos te bastaba.
juandelgado
meddle
popopopo
^_^
No te preocupes, a ver si mañana cojo a algún gafotas de mi curro y se le ocurre una magnífica idea.
Os tendré informados!
meddle
ufff, es que yo de sql voy bastante flojo y ademas ahora me falta glucosa que estoy metiendo caña a zigotica... <- excusa de perdedor, lo se :)
juandelgado
A qué consulta? A:
<code>SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC</code>
Esa te devuelve el arbol "planchado" por la izquierda, no te da los hijos por niveles....
La única relación que encuentro entre los hijos de un mismo nodo, es que el valor de la derecha del hijo de la izquierda es el anterior al valor de la izquierda del siguiente hijo de la derecha.... ya, yo lo he tenido que leer un par de veces para asegurarme que lo ponía bien : ) Pero que en el gráfico se ve muy fácil
De todas formas, ¿cómo se plasma eso en una consulta?
¬_¬
meddle
o me he perdido algo o le puedes poner un LIMIT n... ?
juandelgado
Muy buenas, estoy aquí haciendo sumitas y restas para ver cómo puedo hacer lo siguiente:
Seleccionar con una consulta sólo los primeros hijos de un nodo determinado.
Supongo que te puedes traer todo el árbol del tirón y mostrar sólo lo que te interese, pero eso no está muy optimizado que digamos.... lo bueno sería traerse sólo los 'n' hijos que te interesen del nodo que estás viendo, por ejemplo.
Venga familia, a exprimirse un poco la chola!
dagi3d
busca por internet 'joe celko trees' o 'joe celko nested sets'
el joe celko ese es un crack
meddle
no, por nada, cosas mias... :)
juandelgado
Por qué dices lo de la "j" Sergi?
ñ_ñ
meddle
modo bordecillo on
etttto... jerarquico va con J
modo bordecillo off
por lo demas parece un buen truco ;)
juandelgado
Eh! que este es de los buenos!
¿Qué es lo que no te ha quedado claro, el motivo o la solución?
txuma Plus
No lo he entendido muy bien... pero me lo repasaré, que tus suciotrucos suelen ser buenos :P