Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Consulta secciones hijo

Estas en el tema de Consulta secciones hijo en el foro de Bases de Datos General en Foros del Web. Hola foreros! Espero puedan ayudarme. Tengo una tabla con la siguiente estructura: --------------- SECCIONES --------------- id numeric (5,0) id_padre numeric (5,0) nombre text Esta tabla ...
  #1 (permalink)  
Antiguo 18/02/2004, 13:24
 
Fecha de Ingreso: diciembre-2003
Mensajes: 18
Antigüedad: 20 años, 4 meses
Puntos: 0
Consulta secciones hijo

Hola foreros!

Espero puedan ayudarme.

Tengo una tabla con la siguiente estructura:

---------------
SECCIONES
---------------

id numeric (5,0)
id_padre numeric (5,0)
nombre text


Esta tabla guarda todas las secciones y subsseciones de una web, las subsecciones que pertenecen a otra llevarán en el campo 'id_padre' el 'id' de la sección a la que pertenecen.


Mi pregunta es la siguiente:

Hay alguna consulta que saque todas las secciones hijas de una sección padre, sacando tb las hijas de las hijas. Como creo que no me he explicado bien pongo un ejempo:


Partimos de estos datos


id - id_padre - nombre
1 - 0 ---------- PELIS
2 - 1 ---------- DRAMA
3 - 0 ---------- LIBROS
4 - 0 ---------- Novedades
5 - 1 ---------- ACCION
6 - 5 ---------- CHUACHENEGER


Las secciones que tienen 'id_padre' 0 no son hijas de ninguna sección, como: 'PELIS, LIBROS, NOVEDADES'

La sección con nombre 'ACCION' es hija de 'PELIS' ya que tiene 'id_padre' 1

La subsección 'ACCION' tiene una subsubsección 'CHUACHENEGER' ya que esta tiene 'id_padre' 5 que es el 'id' de 'ACCION'

El árbol seria este:

PELIS
---ACCION
------CHUACHENEGER


¿Hay alguma consulta que dando un id (por ejempo: 1, el de 'PELIS') pueda sacar TODAS las subsecciones hijas, como se muesta en el arbol de arriba?


ha! uso postgresql.
Espero haberme explicado bien, gracias.
__________________
THE MATRIX HAS YOU

Última edición por swas; 18/02/2004 a las 13:43
  #2 (permalink)  
Antiguo 18/02/2004, 15:33
 
Fecha de Ingreso: diciembre-2003
Mensajes: 53
Antigüedad: 20 años, 4 meses
Puntos: 0
Creo que la logica es la siguiente

Para mostrar la cadena completa desde seccion Padre hasta sección hijo menor, como..
Seccion12 > Seccion33 > Seccion4 > Seccion16

Creas un string para ir anexando las secciones a como se van encontrando, separadas con una caracter como "#".
Un ciclo que mientras encuentre sección padre en el campo padre_ID seguirá buscando.
Al ya no encontrar seccion padre termina ciclo.
Guardas en un array con una función de esas que te separan los strings por cada Caracter especificado y te ponen cada una en una celda del array.
Después ejecutas la instrucción de Reverse Array en el mismo array. Porque cuando se encontraron se guardaron e el orden de Hijo > Padre, y lo queremos invertido.
Después un ciclo que te muestra los resultados de todo el contenido de una array, de esos "for each etc...."

Disculpa que no te diga con detalles exactos, pero te aseguro que las instrucciones las puedes encontrar en sitios o manuals en linea.
Si es esto lo que quieres, avísame y tal vez pueda ayudarte con más detalle.

Un pseudocodigo sería
(nombre de funciones inventadas porque no me acuerdo exactamente)

Mientras ($set_Secciones['padre_ID'] > 0)
{
$cadena.="#".$set_Secciones['nombre']
ejecuta_nuevo_query("SELECT * FROM secciones WHERE seccion_ID=".$set_Secciones[padre_ID])

}
Y como al final ya no guardó la ultima seccion, lo hacemos aquí...
$cadena.="#".$set_Secciones['nombre']

$varArray=explode("#",$cadena);
$varArray=reverse($varArray);

mostrar resultados
while (list($key,$value)=each($varArray)){echo $value." >";}

Como te decía, las funciones son de manejo de strings, arrays, ciclos y mySQL.

Espero te sirva

Saludos

Giorgio
__________________
EmpresasEnRed.com
Diseño Web
  #3 (permalink)  
Antiguo 19/02/2004, 04:10
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años
Puntos: 0
Si el límite de hijas acaba en ese nivel, te podría valer con una consulta más o menos así

SELECT Tabla1.Id, Tabla1.IdPadre, Tabla1.Nombre
FROM Tabla1
WHERE (((Tabla1.Id)=1)) OR (((Tabla1.IdPadre)=1))

UNION

SELECT Hija.Id, Hija.IdPadre, Hija.Nombre
FROM Tabla1 AS Hija INNER JOIN Tabla1 ON Hija.IdPadre = Tabla1.Id
WHERE (((Tabla1.IdPadre)=1))

si el anidamiento no tiene límites, ahora mismo no se me acurre nada, ya que, sin un límite, no habría forma de definir cuantos UNION habría que poner

Si con esto te vale???
  #4 (permalink)  
Antiguo 19/02/2004, 06:06
 
Fecha de Ingreso: diciembre-2003
Mensajes: 18
Antigüedad: 20 años, 4 meses
Puntos: 0
Gracias a los dos

Quizas la respuesta que buscaba se aproxima mas a la de Teri.

Pero.... yo estaba buscando una consulta para mostrar un anidamiento sin límites, como dice Teri al final de su post.


No se si con subconsultas es posible hacerlo, yo le llevo dando muchas vueltas y no se me ocurre nada, si pueden seguir ayudandome se lo agradezco.



Un saludo.
__________________
THE MATRIX HAS YOU
  #5 (permalink)  
Antiguo 19/02/2004, 11:27
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años
Puntos: 0
Hola de nuevo Swas:

No sé con qué base de datos trabajas, he estado haciendo pruebas con acces, que es cómodo y sencillo de manejar.

Teniendo una Tabla, Tabla1, donde estarán los datos tal y como los has especificado, creo una Consulta, Consulta1, con la siguiente sentencia SQL:


SELECT Tabla1.Id, Tabla1.IdPadre, Tabla1.Nombre,
IIf([IdPadre]=0,[Id],DLookUp("GranPadre","Consulta1","Id = " & [idPadre])) AS GranPadre
FROM Tabla1;

Con esto obtienes los resultados que dices, he probado hasta una anidación de 5 hijos

Como ves, se llama a sí misma, pero no se me ha ocurrido otra forma.

Espero te sirva de algo

Un saludo
  #6 (permalink)  
Antiguo 20/02/2004, 11:54
 
Fecha de Ingreso: diciembre-2003
Mensajes: 18
Antigüedad: 20 años, 4 meses
Puntos: 0
Gracias Teri por tu respuesta.


Pero desgraciadamente mi BD es postgresql, perdona por no mencionartelo antes. Busqué la función 'DLookUp' pero creo que mi BD sólo la soporta en pl-sql (no estoy del todo seguro), pero alomejor la solución de mi caso es el pl-sql.

No se si hay IF u otras condiciones para consultas sql en postgre.


Espero que me puedas seguir ayudando, gracias.



Un saludo.
__________________
THE MATRIX HAS YOU
  #7 (permalink)  
Antiguo 25/02/2004, 03:03
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años
Puntos: 0
Me temo que hasta aquí puedo llegar, no he utilizado nunca postgressql

El Iif es un condicional, en SQL Server, sería un CASE, y el dlookup(), se puede sustituir por un SELECT, no sé si esto te sirve de mucha ayuda...

Un saludo
  #8 (permalink)  
Antiguo 27/08/2005, 13:29
Avatar de CarlosMtnez  
Fecha de Ingreso: agosto-2003
Mensajes: 68
Antigüedad: 20 años, 8 meses
Puntos: 1
Hola compañeros:

Siento rescatar este mensaje antiguo, pero mi pregunta es si en MySQL se puede leer un árbol sin un límite de niveles con una sóla consulta?

he visto que habéis puesto este query de access:

Código:
SELECT Tabla1.Id, Tabla1.IdPadre, Tabla1.Nombre,
IIf([IdPadre]=0,[Id],DLookUp("GranPadre","Consulta1","Id = " & [idPadre])) AS GranPadre
FROM Tabla1;
Podría transcribirse para usarse en MySQL 4.0 (sin subqueries)?

Un saludo!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:02.