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

Consulta de imagenes

Estas en el tema de Consulta de imagenes en el foro de Mysql en Foros del Web. Hola a todos., estoy intentando realizar un query a 3 tablas PRODUCTO, IMAGEN y GALERIA ... éste último indica las imagenes que perteneces al producto.(tiene ...
  #1 (permalink)  
Antiguo 20/09/2010, 12:39
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Consulta de imagenes

Hola a todos., estoy intentando realizar un query a 3 tablas PRODUCTO, IMAGEN y GALERIA ... éste último indica las imagenes que perteneces al producto.(tiene el id del producto y el id de la imagen)

La tabla IMAGEN tiene un campo "estado" que indica P si la imagen es la principal de la galería o que sale por default. Y N si es normal

Mi meta es hacer un listado de los productos además de mostrar esa imagen default.

Por ahora mi consulta es así:

Código:
SELECT p.producto_id, producto_nombre, i.producto_imagen_thumb, i.producto_imagen_estado
FROM producto p
LEFT JOIN (SELECT producto_id, producto_imagen_id FROM producto_galeria GROUP BY producto_id) AS g
ON p.producto_id=g.producto_id
LEFT JOIN (SELECT producto_imagen_id, producto_imagen_thumb, producto_imagen_estado FROM producto_imagen) AS i
ON g.producto_imagen_id=i.producto_imagen_id
ORDER BY producto_nombre ASC
De esta manera me muestra todos los productos pero me muestra la primera imagen insertada en la tabla.

y este es el resultado:

Código:
id     Producto     Imagen     Estado
---------------------------------------------
1     Gatos           1.jpg          N
2     Perros          2.jpg          N
3     Monos          NULL          NULL
4     Aves             NULL          NULL
Lo hice con LEFT JOIN ya que algunos registros no tienen imagenes necesariamente por eso algunos me resultan NULL.

Ahora si yo quisiera agregar una condición WHERE en la relación galeria-imagen donde indico el tipo de estado "P" me resulta esto:


Código:
SELECT p.producto_id, producto_nombre, i.producto_imagen_thumb, i.producto_imagen_estado
FROM producto p
LEFT JOIN (SELECT producto_id, producto_imagen_id FROM producto_galeria GROUP BY producto_id) AS g
ON p.producto_id=g.producto_id
LEFT JOIN (SELECT producto_imagen_id, producto_imagen_thumb, producto_imagen_estado FROM producto_imagen WHERE producto_imagen_estado='P') AS i
ON g.producto_imagen_id=i.producto_imagen_id
ORDER BY producto_nombre ASC

Y el resultado es este:

Código:
id     Producto     Imagen     Estado
---------------------------------------------
1     Gatos           NULL          NULL
2     Perros          NULL          NULL
3     Monos          NULL          NULL
4     Aves             NULL          NULL
Como ven no captura las imagenes con el estado "P"... intenté con ORDER BY producto_imagen_estado haber si la "P" se ponía arriba de la "N" pero nada!

Mi intención es llegar a :

Código:
id     Producto     Imagen     Estado
---------------------------------------------
1     Gatos           5.jpg          P
2     Perros          9.jpg          P
3     Monos          NULL          NULL
4     Aves             NULL          NULL
No sé que más agregarle o corregir en el query, espero me hayan entendido y me puedan ayudar. Saludos!
__________________
Quitenme la vida pero no la bebida.
  #2 (permalink)  
Antiguo 20/09/2010, 13:56
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta de imagenes

a ver,
primero unes las tablas imagen y producto_galeria, y luego mediante subconsultas haces el right join con la tabla producto. El orden inverso, descendente, sitúa en primer lugar el estado P; el group by deja sólo la primera de todas las imágenes que tengan el mismo id de producto, y la unión con right join permite mostrar todos los productos tengan imágenes o no.
SELECT t1.idp, t1.idpg, t1.imagen, t1.estado FROM (SELECT pg.producto_id idp, pg.producto_imagen_id idpg, i.producto_imagen_thumb imagen, i.producto_imagen_estado estado FROM imagen i INNER JOIN producto_galeria pg ON (i.producto_imagen_id=pg.producto_imagen_id) ORDER BY producto_imagen_estado DESC)t1 RIGHT JOIN producto p ON p.producto_id=t1.idp GROUP BY t1.idp

No lo he probado

Última edición por jurena; 20/09/2010 a las 14:06
  #3 (permalink)  
Antiguo 20/09/2010, 14:15
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Consulta de imagenes

el resultado es:

Código:
id     Producto     Imagen     Estado
---------------------------------------------
NULL     NULL          NULL          NULL
1     Gatos           5.jpg          P
2     Perros          9.jpg          P
Pero no me aparecen los demás registros que no tienen imagenes.... voy a seguir probando....
__________________
Quitenme la vida pero no la bebida.
  #4 (permalink)  
Antiguo 20/09/2010, 14:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta de imagenes

¿Y así?
SELECT t1.idp, t1.idpg, t1.imagen, t1.estado FROM (SELECT pg.producto_id idp, pg.producto_imagen_id idpg, i.producto_imagen_thumb imagen, i.producto_imagen_estado estado FROM imagen i INNER JOIN producto_galeria pg ON (i.producto_imagen_id=pg.producto_imagen_id) ORDER BY producto_imagen_estado DESC)t1 RIGHT JOIN producto p ON t1.idp=p.producto_id GROUP BY p.producto_id

Y si no va, prueba esto:

SELECT p.producto_nombre, t2.imagen FROM producto p LEFT JOIN (SELECT t1.idp, t1.idpg, t1.imagen, t1.estado FROM (SELECT pg.producto_id idp, pg.producto_imagen_id idpg, i.producto_imagen_thumb imagen, i.producto_imagen_estado estado FROM imagen i INNER JOIN producto_galeria pg ON (i.producto_imagen_id=pg.producto_imagen_id) ORDER BY producto_imagen_estado DESC)t1 GROUP BY t1.idp)t2 ON p.producto_id=t2.idp

Tampoco lo he probado
  #5 (permalink)  
Antiguo 20/09/2010, 14:35
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Consulta de imagenes

creo que al inicio debería ser SELECT t2.idp, t2.imagen ahora, me salen todos los registros pero:

Código:
id     Producto     Imagen     Estado
---------------------------------------------
1     Gatos           5.jpg          P
2     Perros          9.jpg          P
NULL     NULL          NULL          NULL
NULL     NULL             NULL          NULL
__________________
Quitenme la vida pero no la bebida.
  #6 (permalink)  
Antiguo 20/09/2010, 14:45
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta de imagenes

¿Qué ocurre con esta?:
SELECT p.nombre_producto, t1.imagen, t1.estado FROM (SELECT pg.producto_id idp, pg.producto_imagen_id idpg, i.producto_imagen_thumb imagen, i.producto_imagen_estado estado FROM imagen i INNER JOIN producto_galeria pg ON (i.producto_imagen_id=pg.producto_imagen_id) ORDER BY producto_imagen_estado DESC)t1 RIGHT JOIN producto p ON t1.idp=p.producto_id GROUP BY p.producto_id

Creo que algo se me está escapando, alguna relación, nombre de campo. Si quieres envía la consulta de creación de tus tablas con algunos datos y haremos alguna prueba.

Última edición por jurena; 20/09/2010 a las 14:56
  #7 (permalink)  
Antiguo 20/09/2010, 17:03
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Consulta de imagenes

Bueno sip, éste último si me ha servido y creo que el secreto es el INNER JOIN de galería e imagen , ya lo había logrado en una consulta aparte, pero no sabía cómo ponerla dentro del producto con el RIGHT, muchas gracias otra vez jurena!
__________________
Quitenme la vida pero no la bebida.

Etiquetas: imagenes
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 22:59.