Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Mysql (http://www.forosdelweb.com/f86/)
-   -   SELECT relacion recursiva (http://www.forosdelweb.com/f86/select-relacion-recursiva-440827/)

micayael 06/11/2006 12:35

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;

Jose_minglein2 08/11/2006 06:56

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


micayael 08/11/2006 07:10

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

Korku 08/11/2006 09:11

Prueba con INNER, LEFT o RIGHT JOIN

Saludos


La zona horaria es GMT -6. Ahora son las 08:30.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.