Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Problema logico (https://www.clubdelphi.com/foros/showthread.php?t=45537)

eugenioclrc 06-07-2007 02:12:47

Problema logico
 
Antes que nada les voy a mostrar las tablas que tengo.

CREATE TABLE `jerarquia` (
`idhijo` int(11) NOT NULL default '0',
`idpadre` int(11) NOT NULL default '0',
`hijos` int(1) NOT NULL default '0',
KEY `idpadre` (`idpadre`),
KEY `idcat` (`idcat`)
)

CREATE TABLE `nombres` (
`id` int(11) NOT NULL,
`nombre` int(11) NOT NULL default '0',
PRIMARY KEY `id` (`id`)
)



Mediante esta tabla represento un arbol, donde idpadre es la identificadion del padre, que es un numero, idhijo es la identificacion numerica del hijo. En la tabla nombres tengo los nombres de los integrantes del arbol.



Vamos a dar un ejemplo, digamos que Carlos, es papa de Alberto, que es papa de Juan. Esto reflejado en la base seria;



tabla nombres;

(1,'Carlos'), (2,'Alberto'), (3,'Juan');



tabla jerarquia;

(1,0,1), (2,1,1), (3,2,0);



Partiendo del id de alguien quiero obtener su arbol genealogico, de la forma id,nombre. Por ejemplo, me dan la id = 2 entonces tendria que obtener;

(1,'Carlos')
(2,'Alberto')

Y todo esto haciendo una sola consulta.



Alguna sugerencia o idea?

gabrielkc 06-07-2007 05:06:56

mmmmmmmmm con una sentencia:

SELECT DISTINCT(P.NOMBRE) ,A.NOMBRE,H.NOMBRE FROM NOMBRES A
LEFT JOIN JERARQUIA J_HIJO ON (A.ID=J_HIJO.IDHIJO) LEFT JOIN
JERARQUIA J_PADRE ON (J_PADRE.IDPADRE=A.ID)
LEFT JOIN NOMBRES H ON (J_HIJO.IDPADRE=H.ID)
LEFT JOIN NOMBRES P ON (J_PADRE.IDHIJO=P.ID)
WHERE A.ID=2

así funciona (aunque repite el nombre del padre si algún registro tiene varios hijos). probablemente con un SP sería mas óptimo

eugenioclrc 06-07-2007 15:18:30

Hola Gabriel, muchas gracias por responderme tan rapidoamente!!! he posteado la misma pregunta en algunos otros foros hace algun tiempo y nadie contesto.

Por cierto, que es un SP?

Saludos

eduarcol 06-07-2007 16:21:30

Store Procedure

eugenioclrc 09-07-2007 05:29:50

Mas dudas
 
Visto y considerando la respuesta mas que satisfactoria del ejemplo anterior, voy a atreverme a pedir ayuda nuevamente, pero con un caso mas definido.

Voy primero a describir el problema.

Digames que tengo una tabla llamada `Categorias`, y en ella hay dos campos, uno llamado `id`, que es de tipo int. Y otro llamado nombre que es un varchar.
Un ejemplo podria ser;

id,nombre
1,'Autos'
2,'Audi'
3,'Tuneado'
4,'0 Kilometro'
5,'Porsche'
6,'Motos'
7,'Honda'

Y tengo otra tabla, que relaciona estas categorias entre si, llamada `jerarquia`, que tiene un `id`, que es un int. Tiene un campo llamado `idcat` que es el numero que hace referencia a la tabla `Categorias`, otro campo llamado `idpadre` que tambien hacer referencia a la tabla `Categorias` y nos dice quien seria el padre de `idcat` (`idpadre` es 0 si no tiene padre, es decir es una categoria principal), y un ultimo campo que es llamado `hijos`, que dice si la categoria `idcat` tiene algun hijo. Al ejemplo anterior le corresponderian los siguientes valores;

id,idcat,idpadre,hijos
NULL,1,0,1
NULL,2,1,1
NULL,3,2,0
NULL,4,2,0
NULL,5,1,0
NULL,6,0,1
NULL,7,6,0

Por ultimo, tengo la tabla `productos`, que contiene un campo llamado `id`, un campo `nombre`, y por ultimo un campo llamado `cat`, que hace referencia a la tabla `Categorias`.`id`, cabe aclarar que siempre se va a referir a una categoria que no tenga hijos.
Un ejemplo seria;

id,nombre,cat
NULL,'Posche 911',5
NULL,'Audi c4 verde',4
NULL,'Audi Gris modelo 82',3
NULL,'Moto 0km',7

Ahora vamos con el problema, obtener todos los productos que sean de una categoria que no tiene hijos es facil, basta con hacer un simple where `cat` = categoriaquequeremos.
Pero que pasa si yo quisiera tener todos los que pertenecen a la categoria Autos por herencia de sus padres?


Saludos, y perdon por ser tan extenso, pero este tipo de problemas suelen necesitar una buena descripcion.
Gracias!!!


La franja horaria es GMT +2. Ahora son las 08:25:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi