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

Consulta anidada en MySQL

Estas en el tema de Consulta anidada en MySQL en el foro de Mysql en Foros del Web. Muy buenas tardes amigos foristas, desde hace mucho no escribo aca, pero en este momento acudo a ustedes para que me colaboren con una consulta ...
  #1 (permalink)  
Antiguo 29/10/2012, 20:32
Avatar de jfhoyosm  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá, Colombia, Colombia
Mensajes: 27
Antigüedad: 12 años, 10 meses
Puntos: 3
Exclamación Consulta anidada en MySQL

Muy buenas tardes amigos foristas, desde hace mucho no escribo aca, pero en este momento acudo a ustedes para que me colaboren con una consulta SQL que no la he volteado por todos lados y no he podido con ella:

El dilema es el siguiente; tengo 3 tablas (departamentos, ciudades y sedes)

Código:
+-----------------------+
|    DEPARTAMENTOS      |
+-----------+-----------+
| depCodigo | depNombre |
+-----------+-----------+
|    01     | CALDAS    |
|    02     | BOGOTA    |
|    03     | ANTIOQUIA |
+-----------+-----------+

+-------------------------------------+
|             CIUDADES                |
+-----------+-----------+-------------+
| ciuDepto  | ciuCodigo |  ciuNombre  |
+-----------+-----------+-------------+
|    01     |    002    | MANIZALES   |
|    01     |    031    | VILLAMARIA  |
|    02     |    002    | BOGOTA D.C. |
|    03     |    001    | VIENA       |
|    03     |    002    | MEDELLIN    |
+-----------+-----------+-------------+

+--------------------------------------------------+
|                     SEDES                        |
+----------+------------+-----------+--------------+
| sedDepto | sedCiudad  | sedCodigo |   sedNombre  |
+----------+------------+-----------+--------------+
|    01    |    002     |     1     | PRINCIPAL    |
|    01    |    031     |     2     | PALERMO      |
|    01    |    031     |     3     | PARQUE       |
|    02    |    002     |     4     | PRINCIPAL    |
|    02    |    002     |     5     | SUR          |
|    02    |    002     |     6     | NORTE        |
|    03    |    001     |     7     | PLAZA MAYOR  |
|    03    |    002     |     8     | PRINCIPAL    |
+----------+------------+-----------+--------------+

Y el resultado que necesito es el siguiente:


                 LISTADO DE SEDES
+-------------------------------------------------+
|   DEPARTAMENTO   |     CIUDAD     |    SEDE     |
+------------------+----------------+-------------+
| CALDAS           | MANIZALES      | PRINCIPAL   |
| CALDAS           | VILLAMARIA     | PALERMO     |
| BOGOTA           | VILLAMARIA     | PARQUE      |
| BOGOTA           | BOGOTA D.C.    | PRINCIPAL   |
| BOGOTA           | BOGOTA D.C.    | SUR         |
| BOGOTA           | BOGOTA D.C.    | NORTE       |
| ANTIOQUIA        | VIENA          | PLAZA MAYOR |
| ANTIOQUIA        | MEDELLIN       | PRINCIPAL   |
+------------------+----------------+-------------+
De antemano agradezco su ayuda, muchas gracias.
  #2 (permalink)  
Antiguo 30/10/2012, 03:06
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta anidada en MySQL

Código MySQL:
Ver original
  1. SELECT d.depNombre as DEPARTAMENTO,
  2.              c.ciuNombre as CIUDAD,
  3.              s.sedNombre as SEDE
  4. FROM (DEPARTAMENTOS d INNER JOIN CIUDADES c ON d.XXXX=c.YYYY)
  5.                 INNER JOIN SEDES s ON c.ZZZZZ=s.WWWWW

Donde XXXXX YYYYY ZZZZZ WWWW son los campos que relacionan las tablas

Una pista sedDepto es inecesario en la tabla sedes, puesto que la relación ya existe por la ciudad
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 30/10/2012, 07:24
Avatar de jfhoyosm  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá, Colombia, Colombia
Mensajes: 27
Antigüedad: 12 años, 10 meses
Puntos: 3
Busqueda Respuesta: Consulta anidada en MySQL

Amigo QUIMFV, probe la consulta y me sale lo mismo que la hago con mi formame saca todas las sedes tantos departamentos alla.


Código MySQL:
Ver original
  1. SELECT d.depNombre as DEPARTAMENTO,
  2. c.ciuNombre as CIUDAD,
  3. s.sedNombre as SEDE
  4. FROM (DEPARTAMENTOS d INNER JOIN CIUDADES c ON d.depCodigo=c.ciuDepto)
  5. INNER JOIN SEDES s ON c.ciuCodigo=s.sedCiudad
y en lo referente al sedDepto si lo necesito, porque como vemos en las tablas dos ciudades pueden tener un mismo codigo, lo unico que las diferencias es el departamento, entonces para saber exactamente que ciudad es necesito tanto el codigo del departamento como el codigo de la ciudad.

Te agradezco mucho tu colaboracion QUIMFV, si me puedes seguir colaborando con la duda te lo agradeceria.

Última edición por gnzsoloyo; 30/10/2012 a las 09:02 Razón: Etiquetado erróneo
  #4 (permalink)  
Antiguo 30/10/2012, 09:01
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, 5 meses
Puntos: 2658
Respuesta: Consulta anidada en MySQL

Código MySQL:
Ver original
  1.     d.depNombre DEPARTAMENTO,
  2.  
  3.     c.ciuNombre CIUDAD,
  4.     s.sedNombre SEDE
  5.     SEDES S
  6.     INNER JOIN DEPARTAMENTOS D ON S.sedDepto = d.depCodigo
  7.     INNER JOIN CIUDADES c ON s.sedCiudad = c.ciuCodigo
En principio, la validación de la relacion entre ciudad y departamento, ya ha sido realizada al momento de insertar la Sede, por lo que no hay que cruzar esas tablas de nuevo, sino sólo buscar los datos de cada una.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 30/10/2012, 09:07
Avatar de jfhoyosm  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá, Colombia, Colombia
Mensajes: 27
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Consulta anidada en MySQL

Gracias GNZSOLOYO por tu colaboracion, pero esta es la consulta que yo hacia siempre y me saca registros duplicados, la verdad ya no se que hacer ...
  #6 (permalink)  
Antiguo 31/10/2012, 07:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta anidada en MySQL

El problema viene de que la PK de la tabla ciudades no es ciuCodigo si no que se debe usar en combinación con ciuDepto

Ciudades

PK ciuDepto+ciuCodigo


| 01 | CALDAS |
| 01 | 002 | MANIZALES |
| 01 | 002 | 1 | PRINCIPAL |
| 01 | 031 | VILLAMARIA |
| 01 | 031 | 2 | PALERMO |
| 01 | 031 | 3 | PARQUE |
| 02 | BOGOTA |
| 02 | 002 | BOGOTA D.C. |
| 02 | 002 | 4 | PRINCIPAL |
| 02 | 002 | 5 | SUR |
| 02 | 002 | 6 | NORTE |
| 03 | ANTIOQUIA |
| 03 | 001 | VIENA |
| 03 | 001 | 7 | PLAZA MAYOR |
| 03 | 002 | MEDELLIN |
| 03 | 002 | 8 | PRINCIPAL |


Tenemos la ciudad 002 en diversos departamentos.


Código MySQL:
Ver original
  1. SELECT d.depNombre as DEPARTAMENTO,
  2.              c.ciuNombre as CIUDAD,
  3.              s.sedNombre as SEDE
  4. FROM (DEPARTAMENTOS d INNER JOIN CIUDADES c ON d.depCodigo=c.ciuDepto)
  5.                 INNER JOIN SEDES s ON c.ciuCodigo=s.sedCiudad
  6.                            and c.ciuDepto=s.sedDepto

Luego si es necesario "sedDepto" en la tabla sedes.

Ahora?

Agregar un campo autoinc a la tabla ciudades, idCiudad, nos daria una PK simple que luego se deberia usar en la tabla sedes, y eliminar los dos campos actuales sedCiudad y sedDepto. Esto simplificaria las cosas y reduciria el espacio utilizado en disco guardando la misma información.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 31/10/2012 a las 07:24
  #7 (permalink)  
Antiguo 31/10/2012, 07:14
Avatar de jfhoyosm  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá, Colombia, Colombia
Mensajes: 27
Antigüedad: 12 años, 10 meses
Puntos: 3
Información Respuesta: Consulta anidada en MySQL

Hola quimfv, nada que me da el resultado esperado. el resultado que me da con este script es el siguiente:

Código:
DEPARTAMENTO 	CIUDAD 	          SEDE
BOGOTA                   BOGOTA, D.C. 	  VILLAVICENCIO
BOGOTA 	                BOGOTA, D.C. 	  TEUSAQUILLO
BOGOTA 	                BOGOTA, D.C.     NETWORK
BOGOTA 	                BOGOTA, D.C. 	  GALERIAS
BOGOTA                  	BOGOTA, D.C. 	  MENTOR
BOGOTA 	                BOGOTA, D.C. 	  FONOSOSTEMS
  #8 (permalink)  
Antiguo 31/10/2012, 07:33
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta anidada en MySQL

Has copiado bien?

Estaria bastante seguro de lo que te he dicho ahora... ayer no me fige que ciuCodigo no era único.....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #9 (permalink)  
Antiguo 31/10/2012, 07:38
Avatar de jfhoyosm  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá, Colombia, Colombia
Mensajes: 27
Antigüedad: 12 años, 10 meses
Puntos: 3
Exclamación Respuesta: Consulta anidada en MySQL

Si amigo copie bien ya lo he revizado varias veces, es mas este escript ya lo habia probado hace rato y no me habia funcionado.
La verdad nunca me habia confundido tanto con una consulta SQL que parece simple.
  #10 (permalink)  
Antiguo 31/10/2012, 07:38
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, 5 meses
Puntos: 2658
Respuesta: Consulta anidada en MySQL

Pregunta del millón: ¿a qué le estás llamando "repeticiones"?
Porque en esa muestra de datos, no hay repeticiones de registros, desde el momento en que en cada uno hay una sede diferente...

En el esquema que describes tienes una relación 1:N entre Departamento y Ciudad, otra relación 1:N entre ciudad y sede y por transitividad de la relación también 1:N entre Sede y Departamento, por lo que si se intenta listar las sedes, por cada sede se repetirán la Ciudad donde esté, y también el Departamento, pero eso es inevitable. ¿Eso lo tienes claro?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 31/10/2012, 07:45
Avatar de jfhoyosm  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá, Colombia, Colombia
Mensajes: 27
Antigüedad: 12 años, 10 meses
Puntos: 3
Información Respuesta: Consulta anidada en MySQL

No en este ultimo script no hay repeticiones, pero me muetra solo las sedes de BOGOTA y hay otas dos de MEDELLIN que no me las muestra, y no se porque.
  #12 (permalink)  
Antiguo 31/10/2012, 07:46
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta anidada en MySQL

Totalmente de acuerdo con lo que dice gnzsoloyo....

Fijate en el listado resultado que pides en el primer post
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #13 (permalink)  
Antiguo 31/10/2012, 07:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta anidada en MySQL

Ese error viene por otro lado no por la consulta.... quizas los datos?

esos datos no vienen del ejemplo inicial que pusiste... VILLAVICENCIO no es ta en los datos iniciales, luego no se que decirte....

Cita:
...hay otras dos de MEDELLIN que no me las muestra...
de aquí deduzco que estas añadiendo alguna restricción que no nos dices puesto que habia mas ciudades
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 31/10/2012 a las 07:55
  #14 (permalink)  
Antiguo 31/10/2012, 07:56
Avatar de jfhoyosm  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá, Colombia, Colombia
Mensajes: 27
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Consulta anidada en MySQL

Quimfv tienes toda la razon en esas dos ciudades tenia un digito equivocado... Mil y mil gracias quimfv se gano el cielo.

Etiquetas: sql, 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 03:33.