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

Consulta

Estas en el tema de Consulta en el foro de Mysql en Foros del Web. Tengo 2 tablas, una con productos y otra con embalajes, y quiero hacer una consulta q a partir del ID del producto me de los ...
  #1 (permalink)  
Antiguo 29/10/2009, 15:32
 
Fecha de Ingreso: septiembre-2009
Mensajes: 108
Antigüedad: 15 años, 2 meses
Puntos: 1
Consulta

Tengo 2 tablas, una con productos y otra con embalajes, y quiero hacer una consulta q a partir del ID del producto me de los distintos embalajes q tiene, este embalaje es

embalaje
embalaje_2
embalaje_3

he probado con

$query_caratula = "SELECT
productos.id,
embalaje.descripcion AS embalaje_d,
FROM
productos
INNER JOIN embalaje ON (productos.embalaje = embalaje.id)
INNER JOIN embalaje ON (productos.embalaje_2 = embalaje.id)
INNER JOIN embalaje ON (productos.embalaje_3 = embalaje.id)

pero me salta el error
Not unique table/alias: 'embalaje'

alguien tiene idea
  #2 (permalink)  
Antiguo 30/10/2009, 01:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Consulta

Yo creo que la estructura que tienes no es la adecuada. Se puede hacer, claro, pero es mejor usar tres tablas y no dos. Me explico:
tabla productos
producto_id
producto_des
tabla embalajes
embalaje_id
embalaje_des
tabla embalajesproductos
embprod_id
refidprod
refidemb


la tabla embalajes tendría, así, los siguientes valores
embalaje_id, embalaje_des
1, embalaje
2, embalaje_2
3, embalaje, 3

Un eje. de aplicación:
el producto cuyo producto_id es 4 aparece en tres tipos de embalajes, el embalaje, embalaje_2 y embalaje_3, cuyos embalaje_id son 1, 2, 3, respectivamente; y el producto 2 sólo tiene el embalaje 2. Pues bien, en la tercera tabla tendrías;
embprod_id, refidprod, refidemb
1, 4, 1
2, 4, 2
3, 4, 3
4, 2, 2

Eso te permitiría trabajar mucho mejor. Con lo que tienes puede hacerse, pero te verás obligado a ir tres veces a la tabla productos para mediante un cruce con embalajes poder mostrar la descripción de los tres, cuando los haya. No será eficiente y dificultará muchas consultas. Si puedes cambiar la tabla, yo te recomendaría esto, pues con un recorrido y dos cruces (INNER JOIN) de tabla te bastaría para tener todo. Piénsatelo. Si no te es imposible modificar la tabla, te haremos una propuesta con lo que tienes.

Respecto al error, es lógico, pues estás intentando unir con la misma tabla 3 veces y eso no puede hacerse sin utilizar 2 alias para esa tabla en las otras dos ocasiones en que vas a ella. De todos modos tampoco te valdría la consulta sólo cambiando añadiendo alias.

Última edición por jurena; 30/10/2009 a las 01:59
  #3 (permalink)  
Antiguo 30/10/2009, 07:06
 
Fecha de Ingreso: septiembre-2009
Mensajes: 108
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Consulta

Lo he modificado de esta forma
CREATE TABLE `embalaje` (
`id` int(11) NOT NULL auto_increment,
`numero` varchar(30) default NULL,
`descripcion` varchar(50) default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
UNIQUE KEY `descripcion` (`descripcion`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=22 ;


CREATE TABLE `mercaderia` (
`id` int(11) NOT NULL auto_increment,
`descripcion` longtext,
`numero` varchar(30) NOT NULL default '',
`descripcion_en` longtext,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
UNIQUE KEY `numero` (`numero`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;


CREATE TABLE `contratos` (
`id` int(11) NOT NULL auto_increment,
`fecha` datetime NOT NULL,
`numero` int(25) NOT NULL,
`mercaderia` int(11) NOT NULL,
`mercaderia_2` int(11) NOT NULL,
`mercaderia_3` int(11) NOT NULL,
`mercaderia_4` int(11) NOT NULL,
`embalaje` int(11) NOT NULL,
`embalaje_2` int(11) NOT NULL,
`embalaje_3` int(11) NOT NULL,
`embalaje_4` int(11) NOT NULL,
`comentario` longtext,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
UNIQUE KEY `numero` (`numero`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=199 ;

Ahora bien, en la consulta a contratos quiero mostrar las mercaderias q tiene ese contrato, y que embalajes tienen las mercaderias.

gracias
  #4 (permalink)  
Antiguo 30/10/2009, 11:36
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Consulta

Sigues por el mismo camino que antes, piensa que si lo que tienes son distintas mercaderías para un mismo contrato, te toca añadir otra tabla más:
tabla mercaderias
id, mercaderia
1,mercaderia
2,mercaderia_2
3,mercaderia_3
4,mercaderia_4
Y luego una tabla
mercaderiascontratos
idmerccontrato, refidcontrato, refidmercaderia



y otra tabla
embalajescontratos
idembcontrato, refidcontrato, refidembalaje

además, claro, de la tabla
contratos
que no debe incluir referencias a mercaderías ni a embalajes.
Sólo id, fecha, numero, comentarios

Última edición por jurena; 30/10/2009 a las 11:46
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 13:56.