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

[SOLUCIONADO] Limitar consulta a tablas relacionales

Estas en el tema de Limitar consulta a tablas relacionales en el foro de Mysql en Foros del Web. Hola, estoy haciendo un sitio para una inmobiliaria y tengo un problemita. Resulta que tengo 3 tablas: LOCALIDADES, donde se almacenan todas las ciudades donde ...
  #1 (permalink)  
Antiguo 15/01/2013, 23:09
 
Fecha de Ingreso: octubre-2010
Ubicación: Uruguay
Mensajes: 23
Antigüedad: 13 años, 5 meses
Puntos: 1
Pregunta Limitar consulta a tablas relacionales

Hola, estoy haciendo un sitio para una inmobiliaria y tengo un problemita.

Resulta que tengo 3 tablas:



LOCALIDADES, donde se almacenan todas las ciudades donde hay viviendas a la venta.

INMUEBLES, con los datos de todos los inmuebles, si están a la venta o alquiler, cantidad de dormitorios, baños etc etc…

IMÁGENES, se guardan varias imágenes pertenecientes a cada una de los inmuebles.

Como pueden ver en la imagen que adjunte, una localidad puede tener varios inmuebles así como cada inmueble puede tener varias imágenes.

El problema es que quiero hacer una consulta SQL con PHP donde me devuelva una Localidad con el Inmueble de esa localidad y solamente una imagen NO todas las imágenes pertenecientes a esa vivienda.

Quiero hacer esto porque el inicio de la pagina de la inmobiliaria va a aparecer un listado de todos los inmuebles que están a la venta (o alquiler) y si la consulta que hago a la base de datos me devuelve todas las imágenes de cada inmueble, van a ver inmuebles que se repiten mas de una vez.

La consulta que hago a la base de datos y me devuelve todas las imágenes es esta:

Código MySQL:
Ver original
  1. SELECT inmuebles.contrato, inmuebles.id, inmuebles.tipo, localidades.ciudad, inmuebles.descripcion, imagenes.imagen, inmuebles.precio
  2. FROM localidades
  3.     INNER JOIN inmuebles ON localidades.id = inmuebles.id_localidad
  4.     LEFT JOIN imagenes ON inmuebles.id = imagenes.id_inmueble
”;

Estuve probando en agregar al final de la consulta esto “GROUP BY imagenes.id_inmueble”, y me muestra una imagen de la vivienda (lo que quiero yo) pero me deja inmuebles afuera que no me los muestra.

Esto es todo espero que se entienda todo y aclaro que esta es la primera vez que trabajo con tablas relacionales, tal vez la tabla de imágenes no era necesaria pero se la agregue para entender un poco mas sobre las relaciones y como unir y consultar varias tablas.

Última edición por gnzsoloyo; 16/01/2013 a las 06:48 Razón: Código SQL sin etiquetar.
  #2 (permalink)  
Antiguo 16/01/2013, 08:19
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: Limitar consulta a tablas relacionales

Vamos a intentar una cosa inventada:
Código MySQL:
Ver original
  1.     I.contrato,
  2.     I.id,
  3.     I.tipo,
  4.     L.ciudad,
  5.     I.descripcion,
  6.     G.imagen,
  7.     I.precio
  8. FROM localidades L
  9.     INNER JOIN inmuebles I L.id = I.id_localidad
  10.     LEFT JOIN
  11.     (SELECT *
  12.     FROM
  13.         (SELECT *
  14.         FROM imagenes
  15.         ORDER BY RAND())
  16.     GROUP BY G.id_inmueble) G ON I.id = G.id_inmueble;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 16/01/2013, 12:18
 
Fecha de Ingreso: octubre-2010
Ubicación: Uruguay
Mensajes: 23
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Limitar consulta a tablas relacionales

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Vamos a intentar una cosa inventada:
Código MySQL:
Ver original
  1.     I.contrato,
  2.     I.id,
  3.     I.tipo,
  4.     L.ciudad,
  5.     I.descripcion,
  6.     G.imagen,
  7.     I.precio
  8. FROM localidades L
  9.     INNER JOIN inmuebles I L.id = I.id_localidad
  10.     LEFT JOIN
  11.     (SELECT *
  12.     FROM
  13.         (SELECT *
  14.         FROM imagenes
  15.         ORDER BY RAND())
  16.     GROUP BY G.id_inmueble) G ON I.id = G.id_inmueble;



Lo puse tal cual como esta en el codigo y me salta error:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'L.id = I.id_localidad LEFT JOIN (SELECT * FROM ' at line 10

Cambie algunas cosas pero no funciona
  #4 (permalink)  
Antiguo 16/01/2013, 13:28
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: Limitar consulta a tablas relacionales

Revisalo de nuevo, usando herramienta con corrector sintáctico, por ejemplo el MySQL Workbench.
__________________
¿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 16/01/2013, 15:26
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Limitar consulta a tablas relacionales

Sin probar nada y sin estar seguro de lo que digo, he quitado de la consulta de gnzsoloyo solamente el alias G delante de id_inmueble, pues entiendo que no puedes invocarlo antes de asignarlo, y lo asignamos después de lanzar la consulta; también he añadido el alias A para la otra consulta entre paréntesis.

Código MySQL:
Ver original
  1.         I.contrato,
  2.         I.id,
  3.         I.tipo,
  4.         L.ciudad,
  5.         I.descripcion,
  6.         G.imagen,
  7.         I.precio
  8.     FROM localidades L
  9.         INNER JOIN inmuebles I L.id = I.id_localidad
  10.         LEFT JOIN
  11.         (SELECT *
  12.         FROM
  13.             (SELECT *
  14.             FROM imagenes
  15.             ORDER BY RAND()) A
  16.         GROUP BY id_inmueble) G ON I.id = G.id_inmueble;
  #6 (permalink)  
Antiguo 16/01/2013, 16:39
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: Limitar consulta a tablas relacionales

Un error nimio, que deberías haber notado @tabam, producto de hacer Copy+Paste, sin revisar bien:
Código MySQL:
Ver original
  1.     I.contrato,
  2.     I.id,
  3.     I.tipo,
  4.     L.ciudad,
  5.     I.descripcion,
  6.     G.imagen,
  7.     I.precio
  8. FROM localidades L
  9.     INNER JOIN inmuebles I ON L.id = I.id_localidad  -- No te diste cuenta que faltaba en ON...
  10.     LEFT JOIN
  11.     (SELECT *
  12.     FROM
  13.         (SELECT *
  14.         FROM imagenes
  15.         ORDER BY RAND())
  16.     GROUP BY G.id_inmueble) G ON I.id = G.id_inmueble;
__________________
¿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 16/01/2013, 21:51
 
Fecha de Ingreso: octubre-2010
Ubicación: Uruguay
Mensajes: 23
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Limitar consulta a tablas relacionales

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Un error nimio, que deberías haber notado @tabam, producto de hacer Copy+Paste, sin revisar bien:
Código MySQL:
Ver original
  1.     I.contrato,
  2.     I.id,
  3.     I.tipo,
  4.     L.ciudad,
  5.     I.descripcion,
  6.     G.imagen,
  7.     I.precio
  8. FROM localidades L
  9.     INNER JOIN inmuebles I ON L.id = I.id_localidad  -- No te diste cuenta que faltaba en ON...
  10.     LEFT JOIN
  11.     (SELECT *
  12.     FROM
  13.         (SELECT *
  14.         FROM imagenes
  15.         ORDER BY RAND())
  16.     GROUP BY G.id_inmueble) G ON I.id = G.id_inmueble;


Hola, si había notado de que faltaba el “ON” pero tampoco me anduvo, es mas hasta saque todos los alias y le puse el nombre completo de los campos pero me sigue dando error, trate de agregarle el AS (que nunca lo maneje mucho y pensé que se usaba para definir los alias) pero tampoco anda.

Ahora probé nuevamente con este ultimo código (“el que tiene ON”) y el navegador me dice esto:

Every derived table must have its own alias

Lo probe tambien en el SQL-Front y me sale este otro mensaje:

SQL execution error #1248. Response from the database:
Every derived table must have its own alias


Estoy trantando de usar el MySQLWorkbench pero me da lo mismos resultados.

Nose si habrá algún problema en la definición de los alias o alla algo mal en la estructura de las tables que cree (no creo, nose).
  #8 (permalink)  
Antiguo 17/01/2013, 22:31
 
Fecha de Ingreso: octubre-2010
Ubicación: Uruguay
Mensajes: 23
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Limitar consulta a tablas relacionales

jeje FUNCIONO!!! Agregándole el ON mas lo que dijo el camarada jurena de agregar el alias A, quedo funcionando.

Es la primera vez que veo esto de las subconsultas y recién estoy entrando con los INNER JOIN asi que al principio cuesta .

Gracias gurús del SQL.
  #9 (permalink)  
Antiguo 21/01/2013, 20:55
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: Limitar consulta a tablas relacionales

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: limitar, 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 06:50.