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

[SOLUCIONADO] consultas de tablas relacionadas

Estas en el tema de consultas de tablas relacionadas en el foro de Mysql en Foros del Web. Buenas. Antes de nada, decir que es la primera vez que trabajo con tablas relacionadas y por mucho que leo no me aclaro. Voy a ...
  #1 (permalink)  
Antiguo 31/03/2013, 11:25
 
Fecha de Ingreso: febrero-2008
Mensajes: 20
Antigüedad: 16 años, 2 meses
Puntos: 2
consultas de tablas relacionadas

Buenas.
Antes de nada, decir que es la primera vez que trabajo con tablas relacionadas y por mucho que leo no me aclaro. Voy a ser lo más claro posible en mi explicación.
Tengo 4 tablas en la base de datos.
1-. paises (id_pais,pais)
2-. regiones (id_region,region,id_pais)
3-. provincias (id_provincia,provincia,id_region)
4-. municipios (id_municipio,municipio,id_provincia)

Las relaciones son (paises-regiones 1:M), (regiones-provincias 1:M) y (provincias-municipios 1:M).

Según he leído no son necesarias las relaciones (paises-provincias 1:M), (paises-municipios 1:M), etc.. y por eso no las he puesto.

En estos momentos tengo como país españa, como regiones todas las de españa, como provincias todas las de españa y como municipios todos los de españa. Cabe destacar que todos los ids son tipo char menos el id_municipio que es int autoincremental.

Las relaciones deben estar bien hechas porque he probado update y delete con resultados satisfactorios. Pero el problema viene con las consultas.

Por más que leo no soy capaz de hacer una consulta para que me muestre todos los municipios de Andalucía.

Y en estos momentos solo tengo un país por lo que la consulta de todos los municipios de españa está clara pero ¿cómo haría esta consulta si tuviera más países en la base de datos?

Gracias.
  #2 (permalink)  
Antiguo 31/03/2013, 11:32
 
Fecha de Ingreso: mayo-2008
Mensajes: 156
Antigüedad: 16 años
Puntos: 0
Respuesta: consultas de tablas relacionadas

LEFT JOIN es lo que buscas.

Se que en este foro, es mas de que el usuario trabaje y sea uno mismo quien saque la consulta (lo digo por experiencia propia aqui), pero como pequeña implementación tienes que relacionar los ID de cada tabla con LEFT JOIN

Código MySQL:
Ver original
  1. SELECT m.id_municipio, m.municipio, p.id_provincia, p.provincia, r.id_region, r.region
  2. FROM municipios m
  3.    LEFT JOIN provincias p ON m.id_provincia=p.id_provincia
  4.    LEFT JOIN regiones r ON r.id_region=p.id_region
  5.    LEFT JOIN paises p ON p.id_pais=r.id_pais
  6. WHERE pais LIKE 'España' AND region LIKE 'Andalucia'

Es decir, tienes perfectamente definidas a mi parecer las tablas y las relaciones son así de simples en donde con LEFT JOIN unes hacia la otra tabla lo que hay en la anterior y la unes a través del ID con el que se relacionan. Y así vas subiendo cada nivel.
  #3 (permalink)  
Antiguo 31/03/2013, 13:29
 
Fecha de Ingreso: febrero-2008
Mensajes: 20
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: consultas de tablas relacionadas

Vale. Muchas gracias. Ahora creo que he entendido todo. Incluso creo que en este caso, debido a la relación de las tablas sería lo mismo LEFT JOIN que INNER JOIN.
Cuando avance en el proyecto tendré relaciones M:M. A ver si me es tan fácil.
Gracias, de nuevo.
  #4 (permalink)  
Antiguo 31/03/2013, 14:06
 
Fecha de Ingreso: mayo-2008
Mensajes: 156
Antigüedad: 16 años
Puntos: 0
Respuesta: consultas de tablas relacionadas

Con INNER JOIN lo que haces es relacionarlas como bien dices, es decir si el ID en todos sitios está correcto y no hay nada NULL, te sacará el municipio por ejemplo, pero en caso de que no esté bien relacionado o falte algun ID en la relación, no te sacaría ese municipio.

En cambio con LEFT JOIN lo que haces es ir "pegando" cada tabla en la siguiente, es decir, vas volcando los datos, tengan o no relación con la otra tabla, por lo que si un ID, estaba huerfano, tambien aparecería pero como NULL

Etiquetas: relacionadas, tabla, tablas
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 10:26.