Ir al contenido


Foto

relacionar 3 tablas mysql


  • Por favor identifícate para responder
4 respuestas en este tema

#1 fercba1

fercba1

    Newbie

  • Miembros
  • Pip
  • 7 mensajes

Escrito 18 octubre 2012 - 06:55

Hola a todos me encuentro en un problema con mysql y es que estoy creando mi primer  carrito de compras y quiero que por cada producto se puedan o no agregar hasta 4 fotos. Es decir en algunos articulos puede que lleve fotos y en otros no.
Mi problema es que me duplica los datos .
La relacion es entre las tablas

productos => fotos
productos => categoria

La primera tabla es Categorias

  `id_categoria` int(5) unsigned NOT NULL AUTO_INCREMENT,
  `nombre_cat` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
  PRIMARY KEY (`id_categoria`)


La segunda tabla es productos

  `id_producto` int(5) unsigned NOT NULL AUTO_INCREMENT,
  `nopro` varchar(200) NOT NULL,
  `id_cat` int(5) NOT NULL,
  `precio` decimal(5,2) NOT NULL,
  `stock` int(4) NOT NULL,
  `total_compra` int(5) NOT NULL,
  `detalle` text  NOT NULL,
  PRIMARY KEY (`id_producto`)


la tercera es la tabla fotos

 `nombre` varchar(200)  NOT NULL,
  `id_pro` int(5) NOT NULL


La consulta que hice es 
SELECT * FROM 
productos as p
JOIN categorias as c
ON
p.id_cat = c.id_categoria
LEFT JOIN fotos as f
ON
p.id_producto = f.id_pro



Aclaro que no soy un experto en mysql, espero que me puedan decir si esta bien la estructura de las tablas o estoy mal.

Saludos y desde ya gracias



  • 0

#2 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 19 octubre 2012 - 08:02

Hola amigo fercba1...

Analizando tu estructura y  la consulta que presentas, no le encuentro nada de inapropiado o erróneo, generas muy bien la relación de maestro detalle entre productos y fotos y con el catálogo de categorías...

Quiero comprender que dices que tus registros se duplican y déjame adivinar: sucede cuando tienes más de una foto para ese producto, cierto ?

Y es que tal y como generaste la consulta, al momento de que un producto tiene más de una foto asignada, genera un registro o tupla con los mismos datos de producto y categoría pero con un dato diferente de foto (si te fijas, ese dato va variando en cada registro "duplicado") lo que hace cada registro diferente...

Ahora, qué hacer ???

Bueno, probablemente al momento de mostrar al usuario la información, puedas controlar la "duplicidad" de datos mediante los componentes que emplees para ello (recuerdo que en los carritos de compra, se muestran los datos generales del producto como encabezado y sus fotos en una rejilla aparte como detalle) o separando en dos consultas productos y categorías (en una) y fotos (en otra) de tal manera que puedas manejar mejor tu información...

Alguien te podría sugerir que como tienes definido un límite de 4 fotos por producto, puedas hacer subconsultas (o algo equivalente) para poder generar 4 columnas más con los datos de las fotos por cada producto... Yo le veo un incoveniente: al tener un maestro-detalle en la base de datos, fácilmente el día de mañana te pueden solicitar que en vez de 4 sean 10 fotos por cada uno... En tu diseño de la BD no tendrías ningún problema, pero en ésta consulta en particular, tendrías que estar rediseñandola cada vez para adaptarla al número de fotos requerido, y además podrías hacerla extremadamente ineficiente, yo honestamente no me iría por ese camino...

Espero que te sea un poco de ayuda y esperemos que dicen los demás ;)

Saludox ! :)
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 19 octubre 2012 - 01:13

SELECT P.NOPRO, C.NOMBRE_CAT, F.NOMBRE FROM PRODUCTOS P
LEFT JOIN CATEGORIAS C ON C.ID_CAT = P.ID_CAT
LEFT JOIN FOTOS F ON F.ID_PRO = P.ID_PRODUCTO
GROUP BY C.NOMBRE_CAT, P.NOPRO, F.NOMBRE
ORDER BY C.NOMBRE_CAT


Prueba con eso.

Saludos.
  • 0

#4 fercba1

fercba1

    Newbie

  • Miembros
  • Pip
  • 7 mensajes

Escrito 19 octubre 2012 - 02:50

SELECT P.NOPRO, C.NOMBRE_CAT, F.NOMBRE FROM PRODUCTOS P
LEFT JOIN CATEGORIAS C ON C.ID_CAT = P.ID_CAT
LEFT JOIN FOTOS F ON F.ID_PRO = P.ID_PRODUCTO
GROUP BY C.NOMBRE_CAT, P.NOPRO, F.NOMBRE
ORDER BY C.NOMBRE_CAT


Prueba con eso.

Saludos.


Muchas gracias por sus respuestas, el resultado que me genera la consulta es parecido al que me generaba anteriormente:

resultado
[table]
[tr]
[td]nopro[/td]
[td]nombre_cat [/td]
[td]nombre[/td]
[/tr]
[tr]
[td]Articulo1[/td]
[td]PC[/td]
[td]  asda54.jpg[/td]
[/tr]
[tr]
[td]Articulo1[/td]
[td] PC [/td]
[td]5a4sd6.jpg[/td]
[/tr][/table]
[table][tr][td]Articulo2[/td]
[td]NOTEBOOK[/td]
[td]NULL[/td]
[/tr]
[/table]

Voy a intentar como mensiono @Fenareth y les contare como me fue.
   
  • 0

#5 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 19 octubre 2012 - 03:15

Efectivamente... la consulta al final relaciona 1 producto con N fotos... lo que genera la misma "duplicidad"

Saludox ! :)
  • 0




IP.Board spam blocked by CleanTalk.