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

Puedo hacer un doble group by utilizando una subconsulta?

Estas en el tema de Puedo hacer un doble group by utilizando una subconsulta? en el foro de Mysql en Foros del Web. Buenas a todos, necesito hacerle una consulta a una base de datos que consiste en lo siguiente: Mostrar todas las empresas agrupadas por ciudad, es ...
  #1 (permalink)  
Antiguo 06/12/2010, 13:11
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Puedo hacer un doble group by utilizando una subconsulta?

Buenas a todos, necesito hacerle una consulta a una base de datos que consiste en lo siguiente:

Mostrar todas las empresas agrupadas por ciudad, es decir que me salga:

Ciudad 1 Empresa 1
Ciudad 1 Empresa 2
Ciudad 1 Empresa 3
Ciudad 2 Empresa 4
Ciudad 2 Empresa 5

O ciudad 1 Empresa 1 - Empresa 2 - Empresa 3

Hasta aca la consulta la hago bien, pero ademas de esto, debo mostrar el listado de personas que trabajan en cada una de las empresas, entonces asumo que la consulta me debe arrojar los resultados como este:

Ciudad 1 Empresa 1 Persona 1
Ciudad 1 Empresa 1 Persona 2
Ciudad 1 Empresa 1 Persona 3
Ciudad 1 Empresa 2 Persona 4

Y no he podido hacer la consulta para este caso:
Las tablas que manejo son:

TABLA CIUDAD

Código SQL:
Ver original
  1. /* Table: CIUDAD                                             */
  2.  
  3. CREATE TABLE EMPRESA
  4. (
  5.    COD_CIU              INT NOT NULL,
  6.    NOM_CIU         VARCHAR(30),
  7.    
  8.    PRIMARY KEY (COD_CIU)
  9. );

TABLA DE EGRESADOS
Código SQL:
Ver original
  1. /* Tabla: EGRESADO (PERSONAS)                                              */
  2.  
  3. CREATE TABLE EGRESADO
  4. (
  5.    NUM_CED_EGR          INT NOT NULL,
  6.    APE_EGR              CHAR(25),
  7.    FEC_NAC_EGR          DATE,
  8.    EMA_EGR              VARCHAR(70),
  9.    PRIMARY KEY (NUM_CED_EGR)
  10. );

TABLA EMPRESAS

Código SQL:
Ver original
  1. /* Table: EMPRESA                                               */
  2.  
  3. CREATE TABLE EMPRESA
  4. (
  5.    NIT_EMP              INT NOT NULL,
  6.    RAZ_SOC_EMP          VARCHAR(50),
  7.    DIR_EMP              VARCHAR(70),
  8.    EMA_EMP              VARCHAR(70),
  9.    REP_LEG_EMP          CHAR(80),
  10.    PRIMARY KEY (NIT_EMP)
  11. );

Y una tabla hija que sale de las dos tablas anteriores y la denomino
EMPRESAS_TRABAJO_EGRESADO, donde guardo cada empresa con cada egresado

Código SQL:
Ver original
  1. /* Table: EMPRESAS_TRABAJO_EGRESADO                             */
  2.  
  3. CREATE TABLE EMPRESAS_TRABAJO_EGRESADO
  4. (
  5.    NUM_CED_EGR          INT NOT NULL,
  6.    NIT_EMP              INT NOT NULL,
  7.    FEC_INI              DATE,
  8.    FEC_FIN              DATE,
  9.    PRIMARY KEY (NUM_CED_EGR, NIT_EMP)
  10. );

Y la consulta la hice de la siguiente forma:

Código MySQL:
Ver original
  1. SELECT c.nom_ciu, e.raz_soc_emp FROM (ciudad c INNER JOIN empresa e USING (cod_ciu)) GROUP BY e.cod_ciu WHERE e.nit_emp IN
  2. (SELECT eg_nom_egr FROM (egresado eg INNER  JOIN empresas_trabajo_egresado ete USING (num_ced_egr) INNER JOIN empresa USING (nit_emp)) GROUP BY ete.nit_emp

Pero no me salen los resultados, como podria hacer esta consulta?

Agradezco me puedan ayudar

Última edición por oscarbt; 06/12/2010 a las 14:13
  #2 (permalink)  
Antiguo 06/12/2010, 14:52
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Respuesta: Puedo hacer un doble group by utilizando una subconsulta?

Saludos

Prueba de esta manera

Código MySQL:
Ver original
  1. SELECT c.nom_ciu, e.raz_soc_emp FROM
  2.       ciudad c INNER JOIN empresa e USING (cod_ciu)
  3.       WHERE e.nit_emp IN
  4.       (SELECT eg_nom_egr
  5.       FROM egresado eg INNER  JOIN empresas_trabajo_egresado ete USING (num_ced_egr) INNER JOIN empresa USING (nit_emp) GROUP BY ete.nit_emp)
  6.       GROUP BY e.cod_ciu
__________________
:.:Nano.:: @nano_hard - Retornando al foro
  #3 (permalink)  
Antiguo 06/12/2010, 15:20
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: Puedo hacer un doble group by utilizando una subconsulta?

La consulta no arroja ningun resultado, pero tampoco genera error.......
  #4 (permalink)  
Antiguo 06/12/2010, 15:50
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Respuesta: Puedo hacer un doble group by utilizando una subconsulta?

Saludos

mmmm o prueba de esta manera
Código MySQL:
Ver original
  1. SELECT c.nom_ciu, e.raz_soc_emp,eg.eg_nom_egr  
  2.   FROM empresa e
  3.   INNER JOIN ciudad c  USING (cod_ciu)
  4.   INNER JOIN empresas_trabajo_egresado ete USING (nit_emp)
  5.   INNER JOIN egresado eg USING (num_ced_egr)
  6.   GROUP BY e.cod_ciu
__________________
:.:Nano.:: @nano_hard - Retornando al foro
  #5 (permalink)  
Antiguo 06/12/2010, 16:51
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: Puedo hacer un doble group by utilizando una subconsulta?

No, aun sigue generando error, pero me surge una duda: cuando utilizo el INNER JOIN, debo tener en cuenta el orden de la consulta?
  #6 (permalink)  
Antiguo 06/12/2010, 18:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Puedo hacer un doble group by utilizando una subconsulta?

Yo a todo el asunto le veo un problema inicial: La tabla "Ciudad" no está relacionada de ninguna forma con las demás, por lo que hacer un INNER JOIN con ella es algo traído de los pelos.
Me explico gráficamente. Este es el modelo según las tablas descriptas:

En este gráfico se puede apreciar que niguna de las otras tablas comparte la clave de la ciudad como FK, por lo que no se puede usar en un INNER JOIN.
Tampoco se puede hacer contra la dirección de la empresa, porque no tienen el mismo dominio: El nombre de la ciudad contiene 50 caracteres y el de la direccion 70.

Si la tabla EMPRESA lleva el código indicado, entonces si.

En cualquier caso lo primero que debes es buscar la relación con las empresas. No con las ciudades, ya que esa es la que te importa:
Código MySQL:
Ver original
  1.      e.raz_soc_emp,
  2.      eg.ape_egr,
  3.      eg.nom_egr
  4. FROM empresa e  
  5.      INNER JOIN empresas_trabajo_egresado ete USING (nit_emp)
  6.      INNER JOIN egresado eg USING (num_ced_egr)
  7. ORDER BY  raz_soc_emp, ape_egr;
Si esto produce resultados, entonces hay que probar:
Código MySQL:
Ver original
  1.      c.nom_ciu,
  2.      e.raz_soc_emp,
  3.      eg.ape_egr,
  4.      eg.nom_egr
  5. FROM empresa e  
  6.      INNER JOIN empresas_trabajo_egresado ete USING (nit_emp)
  7.      INNER JOIN egresado eg USING (num_ced_egr)
  8.      INNER JOIN ciudad c  USING (cod_ciu)
  9. ORDER BY  raz_soc_emp, ape_egr;
Hay que recordar que si no se ha vinculado una empresa con una ciudad, esta consulta no devolverá esa empresa. El INNER JOIN es restrictivo: todos los valores deben existir para que devuelva el registro.
Si existe la posibilidad de que no se haya vinculado el la empresa con la ciudad, debe usarse LEFT JOIN:
Código MySQL:
Ver original
  1.      c.nom_ciu,
  2.      e.raz_soc_emp,
  3.      eg.ape_egr,
  4.      eg.nom_egr
  5. FROM empresa e  
  6.      INNER JOIN empresas_trabajo_egresado ete USING (nit_emp)
  7.      INNER JOIN egresado eg USING (num_ced_egr)
  8.      LEFT JOIN ciudad c  USING (cod_ciu)
  9. WHERE TRUE OR c.cod_ciu IS NULL
  10. ORDER BY  raz_soc_emp, ape_egr;
Detalle: Si un campo puede ser NULL no se debe colocar en el ORDER BY o en el GROUP BY porque ninguna de las dos clausulas puede procesar nulos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 06/12/2010, 19:46
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: Puedo hacer un doble group by utilizando una subconsulta?

El campo COD_CIU si esta presenta en la tabla empresa, lo que pasa es que al publicar el tema lo omiti, no me habia fijado en ese error...es decir, la tabla empresa tiene la siguiente estructura:


                           
 
CREATE TABLE EMPRESA
(
 NIT_EMP              int NOT NULL,
COD_CIU int NOT NULL,
   RAZ_SOC_EMP          varchar(50),
   DIR_EMP              varchar(70),
   EMA_EMP              varchar(70),
   REP_LEG_EMP          char(80),
   PRIMARY KEY (NIT_EMP)
);
Y si esta como FK...
  #8 (permalink)  
Antiguo 07/12/2010, 06:44
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: Puedo hacer un doble group by utilizando una subconsulta?

Usando INNER JOIN, es decir, la segunda consulta:


Código MySQL:
Ver original
  1. c.nom_ciu,
  2. e.raz_soc_emp,
  3. eg.ape_egr,
  4. eg.nom_egr
  5. FROM empresa e INNER JOIN empresas_trabajo_egresado ete USING (nit_emp)
  6. INNER JOIN egresado eg USING (num_ced_egr)
  7. INNER JOIN ciudad c USING (cod_ciu) ORDER BY raz_soc_emp, ape_egr;

Me genera un error pero no se si esto se deba al orden de la consulta.
Utilizando la siguiente consulta, pero con operador AND, si me genera los resultados

Código MySQL:
Ver original
  1. SELECT c.nom_ciu 'Ciudad', e.RAZ_SOC_EMP 'Empresa', GROUP_CONCAT( eg.nom_egr
  2. SEPARATOR  " - " )  'Egresados'
  3. FROM ciudad c, empresa e, egresado eg, empresas_trabajo_egresado ete
  4. WHERE c.cod_ciu = e.cod_ciu
  5. AND e.nit_emp = ete.nit_emp
  6. AND eg.num_ced_egr = ete.num_ced_egr
  7. ete.nit_emp
  8. )

A que se debe?....Cuando utilizo INNER JOIN, se tiene en cuenta el orden de la consulta?...Muchas gracias
  #9 (permalink)  
Antiguo 07/12/2010, 07:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Puedo hacer un doble group by utilizando una subconsulta?

Cita:
Me genera un error pero no se si esto se deba al orden de la consulta.
Tienes que ser más específico: ¿Qué error te genera?
No estamos usando tu base y tu computadora, no podemos acceder a tus datos, por lo que no sabemos a qué error te refieres.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 07/12/2010, 09:38
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: Puedo hacer un doble group by utilizando una subconsulta?

Me aparece:

#1052 - Column 'COD_CIU' in from clause is ambiguous

Porque ?

Cuando tu escribes :

Código MySQL:
Ver original
  1. FROM empresa e
  2. INNER JOIN empresas_trabajo_egresado ete USING (nit_emp)
  3. INNER JOIN egresado eg USING (num_ced_egr)
  4. INNER JOIN ciudad c USING (cod_ciu)

estas relacionando ciudad con egresado?...o con empresa?...o con las dos?
  #11 (permalink)  
Antiguo 07/12/2010, 10:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Puedo hacer un doble group by utilizando una subconsulta?

El tema es simple: Hay más de dos tablas donde existe el campo COD_CIU.
Cuando se da ese tipo de casos es mejor no usar USING sino ON para establecer las relaciones:
Código MySQL:
Ver original
  1.     c.nom_ciu,
  2.     e.raz_soc_emp,
  3.     eg.ape_egr,
  4.     eg.nom_egr
  5.     empresa e INNER JOIN
  6.     empresas_trabajo_egresado ete ON e.nit_emp = ete.nit_emp INNER JOIN
  7.     egresado eg ON ete.num_ced_egr = eg.num_ced_egr INNER JOIN
  8.     ciudad c ON e.cod_ciu = c.cod_ciu
  9. ORDER BY raz_soc_emp, ape_egr;

En el caso de los JOIN con ON, el orden de las tablas en el ON debe respetar el orden de aparición de las tablas, especialmente en el caso de LEFT y RIGHT JOIN.

Nota: No es buena práctica hacer estas relaciones en el WHERE porque el WHERE no es optimizable y el FORM si. Como el WHERE es lo último que se aplica, ya ha leído todos los registros antes de aplicarlo y bien puede haber generado un producto cartesiano.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 07/12/2010, 11:41
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: Puedo hacer un doble group by utilizando una subconsulta?

Muchas gracias por tu ayuda @gnzsoloyo....

Etiquetas: doble, group, subconsulta
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 23:45.