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

[SOLUCIONADO] Duda mysql

Estas en el tema de Duda mysql en el foro de Mysql en Foros del Web. Buenas, La siguiente instrucción mySQL funciona perfectamente, me devuelve justo los 6 registros que corresponden: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT D.referencia , U.familia ...
  #1 (permalink)  
Antiguo 10/10/2015, 17:06
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Duda mysql

Buenas,
La siguiente instrucción mySQL funciona perfectamente, me devuelve justo los 6 registros que corresponden:

Código MySQL:
Ver original
  1. SELECT D.referencia, U.familia, U.situacion1, U.precio, U.metros, U.habitaciones, U.CodigoPostal, P.nombre_poblacion, E.titulo, E.descripcion, F.foto
  2. FROM t_destacats D
  3. INNER JOIN t_un U ON D.referencia = U.referencia
  4. INNER JOIN t_poblacion P ON U.poblacion = P.id_poblacion
  5. INNER JOIN t_es E ON U.id_piso = E.id_piso
  6. WHERE D.id_cat = 3
  7. ORDER BY D.ordre

Y ahora necesitaría añadir una tabla, t_fotos, que en el caso de que existan fotos, devuelva una.
Añado la siguiente instrucción:

Código MySQL:
Ver original
  1. LEFT JOIN t_fotos F ON D.referencia = F.referencia

Es decir, la sentencia entera quedaría así:

Código MySQL:
Ver original
  1. SELECT D.referencia, U.familia, U.situacion1, U.precio, U.metros, U.habitaciones, U.CodigoPostal, P.nombre_poblacion, E.titulo, E.descripcion, F.foto
  2. FROM t_destacats D
  3. INNER JOIN t_un U ON D.referencia = U.referencia
  4. INNER JOIN t_poblacion P ON U.poblacion = P.id_poblacion
  5. INNER JOIN t_es E ON U.id_piso = E.id_piso
  6. LEFT JOIN t_fotos F ON D.referencia = F.referencia
  7. WHERE D.id_cat = 3
  8. ORDER BY D.ordre


Y devuelve 71 registros. Alguna cosa estoy haciendo mal pero no lo se ver. Alguien puede echarme un cable. Gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #2 (permalink)  
Antiguo 10/10/2015, 17:22
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: Duda mysql

LEFT JOIN devuelve todo lo que haya en la tabla a la izquierda, tenga o no coincidencia con el resultado a la derecha.
En tu caso, como lo haces con la primer tabla, puede estar generando 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)
  #3 (permalink)  
Antiguo 11/10/2015, 02:26
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Duda mysql

Gracias por responder,
El problema está que en la tabla fotos existen varios registros con la misma referencia.
Cómo puedo forzar para que sólo me devuelva un registro de la tabla t_fotos?

Gracias

Código MySQL:
Ver original
  1. SELECT D.referencia, U.familia, U.situacion1, U.precio, U.metros, U.habitaciones, U.CodigoPostal, P.nombre_poblacion, E.titulo, E.descripcion, F.foto
  2. FROM t_destacats D
  3. INNER JOIN t_un U ON D.referencia = U.referencia
  4. INNER JOIN t_poblacion P ON U.poblacion = P.id_poblacion
  5. INNER JOIN t_es E ON U.id_piso = E.id_piso
  6. LEFT JOIN t_fotos F ON D.referencia = F.referencia
  7. WHERE D.id_cat = 3
  8. ORDER BY D.ordre
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #4 (permalink)  
Antiguo 11/10/2015, 05:36
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: Duda mysql

Usando INNER, no LEFT.
¿Por qué pusiste LEFT?
__________________
¿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 11/10/2015, 12:41
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Duda mysql

Gracias,
Uso LEFT JOIN en lugar de INNER porqué en la tabla t_fotos puede que encuentre o no un registro.

Gracias. Marta
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #6 (permalink)  
Antiguo 11/10/2015, 14:34
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: Duda mysql

Ok, el detalle de que la foto sea opcional era relevante. Eso lo tendrías que haber explicado desde el inicio, porque afecta la solución.

Hay mas de una solución posible, pero esta sería una:
Código SQL:
Ver original
  1. SELECT
  2.     D.referencia,
  3.     U.familia,
  4.     U.situacion1,
  5.     U.precio,
  6.     U.metros,
  7.     U.habitaciones,
  8.     U.CodigoPostal,
  9.     P.nombre_poblacion,
  10.     E.titulo,
  11.     E.descripcion,
  12.     F.foto
  13. FROM
  14.     t_destacats D
  15.         INNER JOIN
  16.     t_un U ON D.referencia = U.referencia
  17.         INNER JOIN
  18.     t_poblacion P ON U.poblacion = P.id_poblacion
  19.         INNER JOIN
  20.     t_es E ON U.id_piso = E.id_piso
  21.         LEFT JOIN
  22.     (SELECT * FROM t_fotos GROUP BY referencia) F ON D.referencia = F.referencia
  23. WHERE
  24.     D.id_cat = 3
  25.     OR F.referencia IS NULL
  26. ORDER BY D.ordre;

Pruebalo y vemos.
__________________
¿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 11/10/2015, 14:41
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Duda mysql

Gracias gnzsoloyo, acabo de encontrar la solución.
He comentado en el primer post de que podría o no encontrarse fotos, ya que no ser así, la sentencia sería un INNER JOIN como el resto.

Lo he hecho de la siguiente manera:

Código MySQL:
Ver original
  1. SELECT D.referencia, U.familia, U.situacion1, U.precio, U.metros, U.habitaciones, U.CodigoPostal, P.nombre_poblacion, E.titulo, E.descripcion, F.foto
  2. FROM t_destacats D
  3. INNER JOIN t_un U ON D.referencia = U.referencia
  4. INNER JOIN t_poblacion P ON U.poblacion = P.id_poblacion
  5. INNER JOIN t_es E ON U.id_piso = E.id_piso
  6. LEFT JOIN t_fotos F ON D.referencia = F.referencia
  7. WHERE D.id_cat = 3
  8. GROUP BY D.referencia
  9. ORDER BY D.ordre

Puede darse el caso de que no exista ninguna foto, o bien existan varias. Por esto motivo agrupo por referencia.

Muchas gracias de nuevo
__________________
Qué fácil cuando lo sabes y qué difícil cuando no

Etiquetas: join, select, 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 02:53.