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

todos los productos que tenga imágenes?

Estas en el tema de todos los productos que tenga imágenes? en el foro de Mysql en Foros del Web. tengo dos modelos. 1) producto 2) imagen puede suceder lo siguiente: a) un producto tiene imágenes. b) un producto no tiene imágenes. Cada modelo representa ...
  #1 (permalink)  
Antiguo 27/12/2011, 20:23
Avatar de romel_inc  
Fecha de Ingreso: diciembre-2007
Ubicación: Venezuela-monagas
Mensajes: 288
Antigüedad: 16 años, 4 meses
Puntos: 14
todos los productos que tenga imágenes?

tengo dos modelos.

1) producto 2) imagen

puede suceder lo siguiente: a) un producto tiene imágenes. b) un producto no tiene imágenes.

Cada modelo representa una tabla y ambas tablas están relacionadas, donde haciendo una simple consulta obtengo, un array como el siguiente:

[1]
[producto] array(nombre,precio)
[imagen] array(imagen1,imagen2)
[2]
[producto] array(nombre,precio)
[imagen] array(imagen1,imagen2)
[3]
[producto] array(nombre,precio)
[imagen] array()
[4]
[producto] array(nombre,precio)
[imagen] array()
[5]
[producto] array(nombre,precio)
[imagen] array(imagen1,imagen2)

Cual seria la técnica que tendría que implementar para a nivel de sql obtener solo los productos que tenga imagenes.

según el ejemplo anterior solo cumplirían con la condición: 1,2,5


Sera un Sub-querie?
__________________
Lo que se usar (JAVA, Spring MVC, IntelliJ IDEA , GAE, CakePHP, Bootstrap, Underscorejs, jQuery, HTML5, CSS3, JSON, Ajax, Prototype), Aprendiendo a usar Angularjs y Git.
  #2 (permalink)  
Antiguo 27/12/2011, 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: todos los productos que tenga imágenes?

Eso que has colocado:
Cita:
[1]
[producto] array(nombre,precio)
[imagen] array(imagen1,imagen2)
[2]
[producto] array(nombre,precio)
[imagen] array(imagen1,imagen2)
[3]
[producto] array(nombre,precio)
[imagen] array()
[4]
[producto] array(nombre,precio)
[imagen] array()
[5]
[producto] array(nombre,precio)
[imagen] array(imagen1,imagen2)
Sería lo que se denomina pseudocódigo. No nos sirve para dar un ejemplo porque es inaplicable en SQL, ya que no contiene estructuras de tablas (además, en MySQL no existen los arrays).
¿Cuál es la estructura de las tablas que tienes en la base de datos? Eso suponiendo que tengas alguna base de datos...
En principio, y suponiendo que tengas dos tablas (producto e Imagen), la cosnulta involucra un INNER JOIN:
Código MySQL:
Ver original
  1. SELECT P.*
  2. FROM producto P INNER JOIN imagen I ON P.producto_id = I.producto_id
__________________
¿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 28/12/2011, 05:09
Avatar de romel_inc  
Fecha de Ingreso: diciembre-2007
Ubicación: Venezuela-monagas
Mensajes: 288
Antigüedad: 16 años, 4 meses
Puntos: 14
Respuesta: todos los productos que tenga imágenes?

hola, gnzsoloyo.

la estructura de las tablas es la siguiente.

productos.
id | user_id | title | body | price | quantity | condition | status | deleted | created |modified

imagen
id | parent_id | product_id | size | name | deleted | created | modified

luego de que hago una consulta como "selecciona todos los productos por user_id ($id)" obtengo un arreglo como el siguiente:

Código:
Array
(
    [0] => Array
        (
            [Product] => Array
                (
                    [id] => 39
                    [user_id] => 4
                    [title] => wtp bmx
                    [body] => exelente bmx wtp
                    [price] => 1000
                    [quantity] => 30
                    [condition] => 1
                    [status] => 1
                    [deleted] => 0
                    [created] => 2011-11-02 18:06:07
                    [modified] => 2011-12-27 11:36:33
                )

            [User] => Array
                (
                    [id] => 4
                    [role_id] => 2
                    [username] => razden
                    [password] => 72ffa683d21fd02e02df3ef47043d5ed60506c00
                    [name] => romel gomez
                    [email] => [email protected]
                    [activation_key] => activation_key
                    [status] => 1
                    [created] => 0000-00-00 00:00:00
                    [modified] => 0000-00-00 00:00:00
                )

            [Image] => Array
                (
                    [0] => Array
                        (
                            [id] => 200
                            [parent_id] => 
                            [product_id] => 39
                            [size] => full
                            [name] => Picture1434.jpg
                            [deleted] => 0
                            [created] => 2011-12-27 11:33:56
                            [modified] => 2011-12-27 11:33:56
                        )

                    [1] => Array
                        (
                            [id] => 201
                            [parent_id] => 200
                            [product_id] => 39
                            [size] => 900x600px
                            [name] => Picture1430.jpg
                            [deleted] => 0
                            [created] => 2011-12-27 11:33:56
                            [modified] => 2011-12-27 11:33:56
                        )
....
No creo que sea únicamente un INNER JOIN. ya que la tablas están ya relacionadas. traerme un registro de una tabla implica varias consultas a tablas relacionadas.

el problema que tengo es de conocimiento sobre sql, por eso lo coloque como un "pseudocódigo". veras tengo productos con imágenes y productos sin imágenes, cuando hago una consulta como:

"trame todos los productos donde el usuario es tal" //-> me trae todos los productos con imágenes y sin imágenes.

lo que me interesa traerme es "todos los productos que tenga imágenes del usuario tal".

creo yo que implicaría en hacer una sub-consulta sobre el modelo image. como un querie dentro de otro querie, ya lo he echo anteriormente, pero en este caso no puedo imaginarlo.
__________________
Lo que se usar (JAVA, Spring MVC, IntelliJ IDEA , GAE, CakePHP, Bootstrap, Underscorejs, jQuery, HTML5, CSS3, JSON, Ajax, Prototype), Aprendiendo a usar Angularjs y Git.
  #4 (permalink)  
Antiguo 28/12/2011, 05:36
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: todos los productos que tenga imágenes?

Código MySQL:
Ver original
  1. FROM producto P INNER JOIN imagen I ON P.producto_id = I.producto_id
  2. WHERE P.user_id=TAL;

Esto te dará todos los productos del usuario TAL que tengan imagen, pero si un producto tiene mas de una imagen saldrá tantas veces como imagenes tenga....

Por el INNER JOIN aquellos productos que no cumplan P.producto_id = I.producto_id no saldran y el WHERE lo limitará a los productos que ademas sean del usuario TAL. Es decir INNER JOIN muestra todas las parejas de registros donde se cumpla la condicón indicada en ON, por lo tanto un producto que no tiene imagen como su registro no tiene pareja en la tabla imagenes, no sale, pero por lo mismo uno que tenga dos imagenes saldrá dos veces (en otro entorno se diria poligamia, pero aqui seria el producto cartesiano entre los registros que cumplen la condición)

(no uses * es mejor que pongas la lista de los campos que realmente vas a usar precedidos del alias de la tabla origen y separados por coma p.e. P.id,P.user_id,...,I.id,...)


Ojo esto te traera una tabla tabulada con los valores de todos los campos, para crear una estructura como la que muestras tendrás que trabajarlo con progrmación externa, ya te dijo gnzsoloyo que en SQL no existen los array...


id | user_id | title | body | price | quantity | condition | status | deleted | created |modified | id | parent_id | product_id | size | name | deleted | created | modified

una fila como esta para cada pareja de registros, todos los datos del producto seguidos de los de la imagen...

Feliz año a ti y a gnzsoloyo....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 28/12/2011 a las 05:48
  #5 (permalink)  
Antiguo 28/12/2011, 07:28
Avatar de romel_inc  
Fecha de Ingreso: diciembre-2007
Ubicación: Venezuela-monagas
Mensajes: 288
Antigüedad: 16 años, 4 meses
Puntos: 14
Respuesta: todos los productos que tenga imágenes?

Gracias gnzsoloyo y quimfv. tienen razón, la consulta sql funciona, no leí con atención la explicación.

Código:
SELECT * 
FROM products
INNER JOIN images ON products.id = images.product_id
LIMIT 0 , 30
"uno que tenga dos imágenes saldrá dos veces" quimfv, es cierto.

"No nos sirve para dar un ejemplo porque es inaplicable en SQL, ya que no contiene estructuras de tablas (además, en MySQL no existen los arrays)." gnzsoloyo.
"Ojo esto te traera una tabla tabulada con los valores de todos los campos, para crear una estructura como la que muestras tendrás que trabajarlo con progrmación externa, ya te dijo gnzsoloyo que en SQL no existen los array..." quimfv.

Tienen 100% razón los dos.

Yo colocaba los arrays, por que es la forma en que recibo los resultados al hacer una consulta como esta:
Código:
$products = $this->Product->find('all',array('conditions' => array('Product.user_id' => $user['User']['id'])));
Es que estoy trabajando con cakephp.

la clave que me dieron es "INNER JOIN", ahora tengo que ver como armo tal consulta en cakephp ya que hay otras cosas que tengo que considerar.


Feliz año quimfv y gnzsoloyo. Muchas Gracias!
__________________
Lo que se usar (JAVA, Spring MVC, IntelliJ IDEA , GAE, CakePHP, Bootstrap, Underscorejs, jQuery, HTML5, CSS3, JSON, Ajax, Prototype), Aprendiendo a usar Angularjs y Git.
  #6 (permalink)  
Antiguo 28/12/2011, 07:40
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: todos los productos que tenga imágenes?



¡Feliz año nuevo para ambos!
__________________
¿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: productos, 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 16:58.