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

SELECT relacion recursiva

Estas en el tema de SELECT relacion recursiva en el foro de Mysql en Foros del Web. Hola amigos. Tengo un pequeño problema que no se como resolver. Tengo una entidad llamada "categorias" de productos que puede tener como padre a otra ...
  #1 (permalink)  
Antiguo 06/11/2006, 12:35
 
Fecha de Ingreso: noviembre-2003
Ubicación: Paraguay
Mensajes: 382
Antigüedad: 20 años, 5 meses
Puntos: 4
Mensaje SELECT relacion recursiva

Hola amigos.

Tengo un pequeño problema que no se como resolver.

Tengo una entidad llamada "categorias" de productos que puede tener como padre a otra categoria. Mi implementacion es hasta maximo 1 padre. Estos son los campo.

cat_id
cat_nombre
cat_id_padre (puede ser otra cat_id o NULL)
cat_activa

y lo que necesito es poder hacer un SELECT que me traiga el listado de todas las categorias con sus nombres de padres y pruebo algo asi pero no me funciona bien.

//-- esta me trae como quiero pero solo las categorias que tienen padre y no las que no tienen
SELECT cat.cat_id, cat.cat_nombre, cat.cat_id_padre, padre.cat_nombre, cat.cat_activa
FROM categorias cat
JOIN categorias padre ON padre.cat_id = cat.cat_id_padre
ORDER BY cat.cat_nombre


//-- Esta me trae los campos dupliados.
SELECT cat.cat_id, cat.cat_nombre, cat.cat_id_padre, padre.cat_nombre, cat.cat_activa
FROM categorias cat, categorias padre
WHERE padre.cat_id = cat.cat_id_padre
OR cat.cat_id_padre IS NULL
ORDER BY cat.cat_nombre


Me pueden dar una mano. O lo tengo que hacer tipo con un cursor si o si?
A continuacion les doy la sentencia SQL para crear la tabla con datos de ejemplo


SET FOREIGN_KEY_CHECKS=0;

CREATE TABLE `categorias` (
`cat_id` int(3) unsigned NOT NULL auto_increment,
`cat_nombre` varchar(50) NOT NULL default '',
`cat_id_padre` int(3) unsigned default NULL,
`cat_activa` char(1) NOT NULL default '',
PRIMARY KEY (`cat_id`),
UNIQUE KEY `UC_cat_nombre` (`cat_nombre`)
) TYPE=InnoDB COMMENT='Categorias de productos' AUTO_INCREMENT=106 ;


INSERT INTO `categorias` VALUES (1, 'Revisar', NULL, 'N');
INSERT INTO `categorias` VALUES (24, 'Canastas', NULL, 'S');
INSERT INTO `categorias` VALUES (27, 'Aniversarios', NULL, 'S');
INSERT INTO `categorias` VALUES (28, 'Nacimientos', NULL, 'S');
INSERT INTO `categorias` VALUES (29, 'Regalos', NULL, 'S');
INSERT INTO `categorias` VALUES (32, 'Relojes', NULL, 'N');
INSERT INTO `categorias` VALUES (34, 'Bicicletas', NULL, 'S');
INSERT INTO `categorias` VALUES (38, 'Electrodomésticos', NULL, 'S');
INSERT INTO `categorias` VALUES (40, 'Confort', 38, 'S');
INSERT INTO `categorias` VALUES (42, 'Cocina', 38, 'S');
INSERT INTO `categorias` VALUES (43, 'Limpieza', 38, 'S');
INSERT INTO `categorias` VALUES (44, 'TV / Audio', 38, 'S');
INSERT INTO `categorias` VALUES (46, 'Caballeros', 34, 'S');
INSERT INTO `categorias` VALUES (47, 'Damas', 34, 'S');
INSERT INTO `categorias` VALUES (48, 'Niños', 34, 'S');
INSERT INTO `categorias` VALUES (49, 'Niñas', 34, 'S');
INSERT INTO `categorias` VALUES (51, 'Flores', NULL, 'S');
INSERT INTO `categorias` VALUES (54, 'Celulares', NULL, 'S');
INSERT INTO `categorias` VALUES (59, 'Pasacalles', NULL, 'S');
INSERT INTO `categorias` VALUES (60, 'Juguetes', NULL, 'N');
INSERT INTO `categorias` VALUES (61, 'Muebles', NULL, 'S');
INSERT INTO `categorias` VALUES (62, 'Cámaras Digitales', NULL, 'N');
INSERT INTO `categorias` VALUES (63, 'Perfumes', NULL, 'S');
INSERT INTO `categorias` VALUES (64, 'Masculinos', 63, 'S');
INSERT INTO `categorias` VALUES (65, 'Femeninos', 63, 'S');
INSERT INTO `categorias` VALUES (66, 'Navidad', NULL, 'N');
INSERT INTO `categorias` VALUES (67, 'Cuadros', NULL, 'N');
INSERT INTO `categorias` VALUES (68, 'Mascotas', NULL, 'S');
INSERT INTO `categorias` VALUES (70, 'Hombres', 34, 'N');
INSERT INTO `categorias` VALUES (71, 'Jardín', 38, 'S');
INSERT INTO `categorias` VALUES (72, 'Dia de la Madre', NULL, 'N');
INSERT INTO `categorias` VALUES (73, 'Dia del Padre', NULL, 'N');
INSERT INTO `categorias` VALUES (104, 'Prueba', NULL, 'N');
INSERT INTO `categorias` VALUES (105, 'Juan', 104, 'N');


SET FOREIGN_KEY_CHECKS=1;
  #2 (permalink)  
Antiguo 08/11/2006, 06:56
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Código:
SELECT cat.cat_id, cat.cat_nombre, cat.cat_id_padre, padre.cat_nombre, cat.cat_activa
FROM categorias cat
JOIN categorias padre ON padre.cat_id = cat.cat_id_padre OR cat.cat_id_padre IS NULL
ORDER BY cat.cat_nombre
  #3 (permalink)  
Antiguo 08/11/2006, 07:10
 
Fecha de Ingreso: noviembre-2003
Ubicación: Paraguay
Mensajes: 382
Antigüedad: 20 años, 5 meses
Puntos: 4
Hola Jose_minglein2 ese mismo es el segundo ejemplo que escribi que no funciona. me trae duplicados. Para mi es logico que funcionaba pero no me funciona.

Por cada categoria que tiene NULL trae como si fuera que tiene todos los padres
  #4 (permalink)  
Antiguo 08/11/2006, 09:11
Avatar de Korku  
Fecha de Ingreso: noviembre-2003
Ubicación: En un lugar oscuro...
Mensajes: 688
Antigüedad: 20 años, 5 meses
Puntos: 5
Prueba con INNER, LEFT o RIGHT JOIN

Saludos
__________________
Carpe diem quam minimum credula postero.


http://www.programador-freelance.es
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 19:16.