Crear o mejorar la estructura
Hola como va antes que nada muchas gracias por leer este post.
En realidad estoy tratando de generar un estructura de árbol, pero como mis conocimientos en sql, son básicos o medios, tal vez la experiencias les ha planteado algo similar.
Mi idea es crear algo como esto:
+- Primero (id=>1,nivel=>0,dependencia=>,estructura=> )
| |
| + - Otra cosa (id=>4,nivel=>1,dependencia=>1estructura=> 1 )
| |
| + - Algo (id=>5,nivel=>2,dependencia=>4,estructura=> 1_4 )
| |
| + - Algo más (id=>6,nivel=>2,dependecia=>4,estructura=> 1_4)
|
+- Segundo (id=>2,nivel=>0,dependencia=>,estructura=> )
|
+ Tercero (id=>3,nivel=>0,dependencia=>,estructura=> )
El tema es que quiero que sea indefinido, o sea que pueda crear tantos niveles como quiera.
Para esto mi idea fue crear cuatro campos:
Un id, nivel, dependencia, estructura.
En id guardo un numero auto incrementable correspondinte a cada valor ingresado.
Como nivel, especifico un número sobre a que nivel del árbol pertenece, empezando con 0.
Dependiencia, es un intenger que le asigno el valor inmediato superior de la rama, o sea de quien depende.
Y como estructura (un blob) guardo los id de cada nivel principal, hasta llegar al valor seleccionado, separados por un separador común en mi caso un undercore (_).
Si te fijas en los valores que puse al lado de cada rama, tal vez le queda más claro.
Bueno para resolverlo, hago dos consulta una leyendo el campo estructura perteneciente al id pasado con lo que genero (previo un pequeño proceso de desarme) un pedazo de una posterior consulta donde me da toda la rama hasta el valor que quiero.
Lo hago con algo como esto
'SELECT estructura FROM categoria id=' por ejemplo 4
Después obtengo hago una consulta donde busco todo los niveles 0, ademas de los id que recientemente obtuvimos y todo los valores de que dependan (campo dependencia) del id pasado, ademas del id que paso obviamente, con algo como esto:
'SELECT id,nivel,texto FROM categoria WHERE id="id pasado, ejemplo 4" AND dependencia="id pasado, ejemplo 4" AND nivel=0 y le sumo los resultados de la consulta previa como id="ejemplo 1"
Todo esto lo proceso y lo selecciono según pertenezca o no a el nivel cero si pertenece al nivel cero lo cargo a un array y si no lo cargo a otro, pero si pertenece al nivel cero me fijo si ese valor no esta dentro de un array asociativo de la primera consulta, si es así, creo una variable indicando cual es el campo, porque luego le voy a agregar una nueva entrada (ANEXO)con el array que no tiene nivel cero, un poco más gráfico, seria:
respuesta que creo:
array = (
[
ID=>1,
NIVEL=>0,
TEXTO=>'Primero',
ANEXO=>[
[ID=>4,NIVEL=>1,TEXTO=>'Otra cosa']
[ID=>5,NIVEL=>2,TEXTO=>'Algo']
[ID=>6,NIVEL=>2,TEXTO=>'Algo más']
]
],
[
ID=>2,
NIVEL=>0,
TEXTO=>'Segundo',
],
[
ID=>3,
NIVEL=>0,
TEXTO=>'Tercero',
]
)
Bueno, para que no se cansen, ¿acá va la pregunta?
Conoces o piensas en alguna forma mejor de hacerlo, estructurándolo de otro modo, la idea seria hacer todo en una consulta, aunque no es necesario seguir este formato, tal vez y solo tal vez la estructura de respuesta, aunque ideas seguramente tienes muchas y variadas.
Espero no haber sido más tedioso de lo necesario, te mando un gran saludo.
Y gracias por solo leerlo.
En realidad estoy tratando de generar un estructura de árbol, pero como mis conocimientos en sql, son básicos o medios, tal vez la experiencias les ha planteado algo similar.
Mi idea es crear algo como esto:
+- Primero (id=>1,nivel=>0,dependencia=>,estructura=> )
| |
| + - Otra cosa (id=>4,nivel=>1,dependencia=>1estructura=> 1 )
| |
| + - Algo (id=>5,nivel=>2,dependencia=>4,estructura=> 1_4 )
| |
| + - Algo más (id=>6,nivel=>2,dependecia=>4,estructura=> 1_4)
|
+- Segundo (id=>2,nivel=>0,dependencia=>,estructura=> )
|
+ Tercero (id=>3,nivel=>0,dependencia=>,estructura=> )
El tema es que quiero que sea indefinido, o sea que pueda crear tantos niveles como quiera.
Para esto mi idea fue crear cuatro campos:
Un id, nivel, dependencia, estructura.
En id guardo un numero auto incrementable correspondinte a cada valor ingresado.
Como nivel, especifico un número sobre a que nivel del árbol pertenece, empezando con 0.
Dependiencia, es un intenger que le asigno el valor inmediato superior de la rama, o sea de quien depende.
Y como estructura (un blob) guardo los id de cada nivel principal, hasta llegar al valor seleccionado, separados por un separador común en mi caso un undercore (_).
Si te fijas en los valores que puse al lado de cada rama, tal vez le queda más claro.
Bueno para resolverlo, hago dos consulta una leyendo el campo estructura perteneciente al id pasado con lo que genero (previo un pequeño proceso de desarme) un pedazo de una posterior consulta donde me da toda la rama hasta el valor que quiero.
Lo hago con algo como esto
'SELECT estructura FROM categoria id=' por ejemplo 4
Después obtengo hago una consulta donde busco todo los niveles 0, ademas de los id que recientemente obtuvimos y todo los valores de que dependan (campo dependencia) del id pasado, ademas del id que paso obviamente, con algo como esto:
'SELECT id,nivel,texto FROM categoria WHERE id="id pasado, ejemplo 4" AND dependencia="id pasado, ejemplo 4" AND nivel=0 y le sumo los resultados de la consulta previa como id="ejemplo 1"
Todo esto lo proceso y lo selecciono según pertenezca o no a el nivel cero si pertenece al nivel cero lo cargo a un array y si no lo cargo a otro, pero si pertenece al nivel cero me fijo si ese valor no esta dentro de un array asociativo de la primera consulta, si es así, creo una variable indicando cual es el campo, porque luego le voy a agregar una nueva entrada (ANEXO)con el array que no tiene nivel cero, un poco más gráfico, seria:
respuesta que creo:
array = (
[
ID=>1,
NIVEL=>0,
TEXTO=>'Primero',
ANEXO=>[
[ID=>4,NIVEL=>1,TEXTO=>'Otra cosa']
[ID=>5,NIVEL=>2,TEXTO=>'Algo']
[ID=>6,NIVEL=>2,TEXTO=>'Algo más']
]
],
[
ID=>2,
NIVEL=>0,
TEXTO=>'Segundo',
],
[
ID=>3,
NIVEL=>0,
TEXTO=>'Tercero',
]
)
Bueno, para que no se cansen, ¿acá va la pregunta?
Conoces o piensas en alguna forma mejor de hacerlo, estructurándolo de otro modo, la idea seria hacer todo en una consulta, aunque no es necesario seguir este formato, tal vez y solo tal vez la estructura de respuesta, aunque ideas seguramente tienes muchas y variadas.
Espero no haber sido más tedioso de lo necesario, te mando un gran saludo.
Y gracias por solo leerlo.
2 respuestas
Respuesta de mcmarthygan
1
Respuesta de shinshan
1