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

Consulta jerárquica

Estas en el tema de Consulta jerárquica en el foro de Mysql en Foros del Web. Hola buenas noches gente, Veran estoy creando un bdd con una estructura jerárquica y relacional @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original CREATE TABLE `categorias` ( ...
  #1 (permalink)  
Antiguo 12/01/2012, 23:30
Avatar de arsenal  
Fecha de Ingreso: agosto-2008
Mensajes: 65
Antigüedad: 15 años, 8 meses
Puntos: 2
Consulta jerárquica

Hola buenas noches gente,

Veran estoy creando un bdd con una estructura jerárquica y relacional

Código MySQL:
Ver original
  1. CREATE TABLE `categorias` (
  2.   `nombre` varchar(140) NOT NULL,
  3.   `pariente` int(3) default NULL,
  4.   PRIMARY KEY  (`id`)
  5. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
  6.  
  7. --
  8. -- Volcar la base de datos para la tabla `categoria`
  9. --
  10.  
  11. INSERT INTO `categorias` VALUES (1, 'papa', NULL);
  12. INSERT INTO `categorias` VALUES (2, 'hijo', 1);
  13. INSERT INTO `categorias` VALUES (3, 'nieto', 2);
  14. INSERT INTO `categorias` VALUES (4, 'bisnieto', 3);
  15.  
  16. --
  17. -- Volcar la base de datos para la tabla `categoria`
  18. --
  19.  
  20. CREATE TABLE `subcategorias_negocios` (
  21.   `negocio` int(8) NOT NULL,
  22.   `subcategoria` int(3) NOT NULL,
  23.   PRIMARY KEY  (`id`)
  24. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
  25.  
  26. INSERT INTO `subcategorias_negocios` VALUES (1, 1, 1);
  27. INSERT INTO `subcategorias_negocios` VALUES (2, 2, 1);
  28. INSERT INTO `subcategorias_negocios` VALUES (3, 4, 2);
  29. INSERT INTO `subcategorias_negocios` VALUES (4, 5, 3);
  30. INSERT INTO `subcategorias_negocios` VALUES (5, 6, 4);

Bien como pueden ver en la tabla categorias el registro con NULL en el campo pariente será la categoria padre o principal.

Yo quisiera sacar el total de negocios que tengo en la categoria principal.

De acuerdo a subcategorias_negocios deberia regresarme y decirme que tengo 6 negocios en la categoria principal (Padre de la tabla categoria categorias)

Como podría ser está consulta?


Saludos
  #2 (permalink)  
Antiguo 13/01/2012, 02:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta jerárquica

Revisa bien lo que dices... porque si tienes solo 5 registros dificilmente te van a salir 6... por otro lado no tienes definida ninguna relacion entre las dos tablas que muestras con lo que no podemos adivinar como las quieres relacionar. Y finamente en la tabla parientes normalmente se definen dos campos mas "nivel" y "orden" para poder gestionarla.

El primero, nivel, se usa para guardar la distancia con el nodo principal, los hijos tendrian nivel 1, nietos 2.... no digo que no se pueda calcular pero ....

Y orden para determinar el orden entre nodos del mismo nivel...este se podria obviar si por ejemplo te sirve el orden alfabetico sobre nombre o en un caso mas real tienes una fecha de creación o nacimiento para ordenarlos.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 13/01/2012 a las 02:30
  #3 (permalink)  
Antiguo 13/01/2012, 10:43
Avatar de arsenal  
Fecha de Ingreso: agosto-2008
Mensajes: 65
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Consulta jerárquica

Hola quimfv, tienes razón me fije mal y si tendria que arrojarme 5 negocios en total, la relacion que tengo entre las dos tablas es ID de la tabla categorias con el campo SUBCATEGORIA de la tabla subcategorias_negocios en cuento a nivel sería hasta 4 niveles máximo o sea padre > hijo > nieto > bisnieto es decir :

categoria princila (padre)
----------subcategoria de padre (hijo)
--------------------subcategoria de subcategoria de padre (nieto)
------------------------------subcategoria de subcategoria de subcategoria de padre (bisnieto)

y orden seria por alfabeto,

mil disculpas por olvidar estos datos

Saludos y gracias de antemano
  #4 (permalink)  
Antiguo 16/01/2012, 02:03
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta jerárquica

Si X es el padre que buscas


Código MySQL:
Ver original
  1. SELECT id,
  2.    negocio
  3. FROM subcategorias_negocios
  4. WHERE subcategoria=X
  5. SELECT sn.id,
  6.    sn.negocio
  7. FROM subcategorias_negocios sn INNER JOIN categorias c
  8.     ON sn.subcategoria=c.id
  9. WHERE c.pariente=X
  10. SELECT sn.id,
  11.   sn.negocio
  12. FROM subcategorias_negocios sn INNER JOIN categorias c
  13.   ON sn.subcategoria=c.id
  14. WHERE c.pariente IN (SELECT c.id
  15.                               FROM categorias c
  16.                                WHERE c.pariente=X)
  17. SELECT sn.id,
  18.   sn.negocio
  19. FROM subcategorias_negocios sn INNER JOIN categorias c
  20.   ON sn.subcategoria=c.id
  21. WHERE c.pariente IN (SELECT c.id
  22.                          FROM categorias c
  23.                          WHERE pariente IN (SELECT c.id
  24.                                              FROM categorias c
  25.                                                        WHERE c.pariente=X));

Si padre=X esta consulta te dará los negocios de X y sus decendientes.

Queda claro que esto solo sirve para una estructura como la que planteas donde hay solo 4 y no mas niveles jerarquicos. Y no existen descendientes sin ascendentes (excepto en el primer nivel).
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 16/01/2012 a las 02:25
  #5 (permalink)  
Antiguo 16/01/2012, 10:46
Avatar de arsenal  
Fecha de Ingreso: agosto-2008
Mensajes: 65
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Consulta jerárquica

Muchas gracias quimfv ahora mismo lo checo pero a como lo veo esta consulta me mostrará todos los negocios que tenga padre x cierto?

Yo solo queria sacar el total de negocios en categoría padre pero en número asi como contador, o sea contar el total de registros en esa categoría por ejemplo Alimentos (10) donde 10 es el número total de negocios en esa categoría y es que aqui ya no se como meterle el count o sumo o como .

Esta me servirá para mostrar los negocios :)

Saludos y gracias de antemano
  #6 (permalink)  
Antiguo 18/01/2012, 09:15
Avatar de arsenal  
Fecha de Ingreso: agosto-2008
Mensajes: 65
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Consulta jerárquica

Código MySQL:
Ver original
  1. SELECT id,
  2.        negocio, count(*) total
  3.     FROM subcategorias_negocios
  4.     WHERE subcategoria=X
  5.     UNION ALL
  6.     SELECT sn.id,
  7.        sn.negocio
  8.     FROM subcategorias_negocios sn INNER JOIN categorias c
  9.         ON sn.subcategoria=c.id
  10.     WHERE c.pariente=X
  11.     UNION ALL
  12.     SELECT sn.id,
  13.       sn.negocio
  14.     FROM subcategorias_negocios sn INNER JOIN categorias c
  15.       ON sn.subcategoria=c.id
  16.     WHERE c.pariente IN (SELECT c.id
  17.                                   FROM categorias c
  18.                                    WHERE c.pariente=X)
  19.     UNION ALL
  20.     SELECT sn.id,
  21.       sn.negocio
  22.     FROM subcategorias_negocios sn INNER JOIN categorias c
  23.       ON sn.subcategoria=c.id
  24.     WHERE c.pariente IN (SELECT c.id
  25.                              FROM categorias c
  26.                              WHERE pariente IN (SELECT c.id
  27.                                                  FROM categorias c
  28.                                                            WHERE c.pariente=X));



no logro obtener el total tambien creo que no necesito especificar el negocio si no que me arroje todas las categorias con existententes (categorias padre) con su total
  #7 (permalink)  
Antiguo 20/01/2012, 02:56
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta jerárquica

Código MySQL:
Ver original
  1. SELECT sbc.id,sbc.negocio,count(*)
  2.        negocio
  3.     FROM subcategorias_negocios
  4.     WHERE subcategoria=X
  5.     UNION ALL
  6.     SELECT sn.id,
  7.        sn.negocio
  8.     FROM subcategorias_negocios sn INNER JOIN categorias c
  9.         ON sn.subcategoria=c.id
  10.     WHERE c.pariente=X
  11.     UNION ALL
  12.     SELECT sn.id,
  13.       sn.negocio
  14.     FROM subcategorias_negocios sn INNER JOIN categorias c
  15.       ON sn.subcategoria=c.id
  16.     WHERE c.pariente IN (SELECT c.id
  17.                                   FROM categorias c
  18.                                    WHERE c.pariente=X)
  19.     UNION ALL
  20.     SELECT sn.id,
  21.       sn.negocio
  22.     FROM subcategorias_negocios sn INNER JOIN categorias c
  23.       ON sn.subcategoria=c.id
  24.     WHERE c.pariente IN (SELECT c.id
  25.                              FROM categorias c
  26.                              WHERE pariente IN (SELECT c.id
  27.                                                  FROM categorias c
  28.                                                            WHERE c.pariente=X))) sbc
  29. GROUP BY sbc.id,sbc.negocio;

Ahora...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #8 (permalink)  
Antiguo 20/01/2012, 14:03
Avatar de arsenal  
Fecha de Ingreso: agosto-2008
Mensajes: 65
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Consulta jerárquica

Hola Quim mucha gracias por tu ayuda nada mas hay algo que no logro entender y es por que X? en esta parte subcategoria=X ?

Ya miro y veo muchas gracias por tu ayuda y su tiempo. ya le cuento
  #9 (permalink)  
Antiguo 21/01/2012, 04:57
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta jerárquica

Primero buscas los negocios de X, subcategoria=X, luego los de los hijos de X, pariente=X, luego los nietos, pariente IN ( ... pariente=X )
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #10 (permalink)  
Antiguo 24/01/2012, 11:00
Avatar de arsenal  
Fecha de Ingreso: agosto-2008
Mensajes: 65
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Consulta jerárquica

Muchas gracias quimfv ahi quedo funcionando al 100

Saludos

Etiquetas: tabla
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:32.