Retroceder   Foros del Web > Programación para sitios web > Bases de Datos > Mysql

Respuesta
 
Herramientas Desplegado
Antiguo 06-nov-2006, 11:35   #1 (permalink)
micayael está en el buen camino
 
Fecha de Ingreso: noviembre-2003
Ubicación: Paraguay
Mensajes: 370
Enviar un mensaje por MSN a micayael
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;
micayael está desconectado   Responder Citando
Antiguo 08-nov-2006, 05:56   #2 (permalink)
Jose_minglein2 tiene algunos puntos positivos de karma
 
Avatar de Jose_minglein2
 
Fecha de Ingreso: noviembre-2004
Mensajes: 2.338
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
Jose_minglein2 está desconectado   Responder Citando
Antiguo 08-nov-2006, 06:10   #3 (permalink)
micayael está en el buen camino
 
Fecha de Ingreso: noviembre-2003
Ubicación: Paraguay
Mensajes: 370
Enviar un mensaje por MSN a micayael
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
micayael está desconectado   Responder Citando
Antiguo 08-nov-2006, 08:11   #4 (permalink)
Korku ha deshabilitado el karma
 
Avatar de Korku
 
Fecha de Ingreso: noviembre-2003
Ubicación: En un lugar oscuro...
Mensajes: 691
Prueba con INNER, LEFT o RIGHT JOIN

Saludos
__________________
Carpe diem quam minimum credula postero.
Korku está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 15:33.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93