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

Error en Left Join

Estas en el tema de Error en Left Join en el foro de Mysql en Foros del Web. Hola amigos foristas nuevamente acudiendo por su ayuda. Tengo un problema con dos tablas a las cuales les quiero hacer un join (productos y calc_prens), ...
  #1 (permalink)  
Antiguo 07/09/2008, 17:22
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 1
Error en Left Join

Hola amigos foristas nuevamente acudiendo por su ayuda.

Tengo un problema con dos tablas a las cuales les quiero hacer un join (productos y calc_prens), estoy realizando un formulario para edicion de pedidos,y deseo traer TODOS los productos que tengo en la tabla productos ( filtrados por item_group), y a su vez traer las cantidades de esos productos que se encuentran en la tabla calc_prens(que es algo como mi pedido). mi consulta es :

Tablas
calc_prens: id_prensa, id_cotiza, volumen, cant_item, item, precio_item, monto_item
productos: id_producto, id_proveedor, producto, item_group, costo_producto

Código PHP:
SELECT FROM productos LEFT JOIN calc_prensa ON 
productos
.producto calc_prensa.item where item_group and id_cotiza =36 

Pero al hacer esto solo me devuelve los productos que se encuentran en la tabla calc_prens y no la lista completa de productos tal como deseo ( no me importa que el los que no tengan coincidencia devuelvan null). Gracias por anticipado
  #2 (permalink)  
Antiguo 08/09/2008, 03:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Error en Left Join

daniken,
tu problema es una contradicción en la consulta. Le pides un Left join de productos, sí, pero al tiempo limitas el contenido de ese LEFT JOIN a aquellos cuyo productos.item_group es igual a 2, y esos son los que te sacará.
Si quieres sacarlos todos, intenta esto (no lo he probado).

Cita:
SELECT p2.producto, p2.id_proveedor, p2.item_group, p2.costo_producto, cp.id_prensa, cp.id_cotiza, cp.volumen, cp.cant_item, cp.item, cp.precio_item, cp.monto_item FROM productos p2 LEFT JOIN calc_prens cp ON p2.producto = cp.calc_prensa.item INNER JOIN (SELECT id_producto FROM productos p INNER JOIN calc_prensa c ON p.producto = c.calc_prensa.item where p.item_group = 2 and c.id_cotiza =36)T1 ON p2.id_producto = T1.id_producto
Explicación: busco primero mediante INNER JOIN los productos que cumplen esos requisitos. Eso lo hago en la selección a la que pongo el alias T1. Luego hago un LEFT JOIN de la tabla productos con la tabla calc_prensa y un inner join de esta con la selección que he llamado T1. El denominador común de las tabla productos con la selección es el id_producto de los encontrados con esas condiciones. Esos los mostrará con los datos; en los demás los datos serán nulos. Poniendo a los campos que se muestran IFNULL(campo, '-'), escribirá un guión en lugar del a veces molesto NULL.
  #3 (permalink)  
Antiguo 08/09/2008, 12:35
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 1
Respuesta: Error en Left Join

Hola Juerena Nuevamente. He intentado seguir con tu ejemplo y al ejecutar el sql que me colocas antes me aparece el mensaje
Cita:
#1054 - Unknown column 'c.calc_prensa.item' in 'on clause'
En principio no se por que si el campo item existe en la tabla calc_prensa, Con lo que asumi que no estaba tomando el alias, asi que le hice una modificacion y quedo así
Código PHP:

SELECT productos
.productoproductos.id_proveedorproductos.item_group,
 
productos.costo_productocp.id_prensacp.id_cotizacp.volumencp.cant_item,
 
cp.itemcp.precio_itemcp.monto_item FROM productos AS p2 LEFT JOIN 
calc_prensa 
AS cp  ON p2.producto cp.calc_prensa.item INNER JOIN (SELECT
 id_producto FROM productos 
AS p INNER JOIN calc_prensa AS c ON 
p
.producto c.calc_prensa.item where p.item_group and c.id_cotiza =36)T1
 ON p2
.id_producto T1.id_producto 
Pero me sigue dando el mismo mensaje.
Cita:
#1054 - Unknown column 'c.calc_prensa.item' in 'on clause'

Disculpa el fastidio pero es primera vez que realizo join entre tablas, y eres la unica persona me que ha ayudadado hasta el momento

PD. Disculpa que te escriba en ambos foros pero sería bueno para que las personas que lleven el post no pierdan el hilo.

Última edición por danikene; 08/09/2008 a las 12:43
  #4 (permalink)  
Antiguo 08/09/2008, 12:47
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Error en Left Join

Perdona, es que te he puesto el nombre del campo y su alias. Prueba así:

SELECT p2.producto, p2.id_proveedor, p2.item_group, p2.costo_producto, cp.id_prensa, cp.id_cotiza, cp.volumen, cp.cant_item, cp.item, cp.precio_item, cp.monto_item FROM productos p2 LEFT JOIN calc_prens cp ON p2.producto = cp.calc_prensa.item INNER JOIN (SELECT id_producto FROM productos p INNER JOIN calc_prensa c ON p.producto = c.item where p.item_group = 2 and c.id_cotiza =36)T1 ON p2.id_producto = T1.id_producto

Y no te preocupes
  #5 (permalink)  
Antiguo 08/09/2008, 13:08
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 1
Respuesta: Error en Left Join

Fijate, si ejecuto la consulta tal como la colocas vuelvo a obtener el error
Cita:
#1054 - Unknown column 'cp.calc_prensa.item' in 'on clause'
pero si la dejo 'cp.item' la consulta se ejecuta pero no me devuelve todos los productos ni me filtra el id_cotiza =36 fijate como quedó a ver si es por lo que elimine.

SELECT p2.producto, p2.id_proveedor, p2.item_group, p2.costo_producto, cp.id_prensa, cp.id_cotiza, cp.volumen, cp.cant_item, cp.item, cp.precio_item, cp.monto_item FROM productos p2 LEFT JOIN calc_prensa cp ON p2.producto = cp.item INNER JOIN (SELECT id_producto FROM productos p INNER JOIN calc_prensa c ON p.producto = c.item where p.item_group = 2 and c.id_cotiza =36)T1 ON p2.id_producto = T1.id_product


Gracias nuevamente amigo.
  #6 (permalink)  
Antiguo 08/09/2008, 13:46
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Error en Left Join

Si la relación entre las tablas la estableces entre producto de la tabla productos y item de la tabla calc_prens, esto debería funcionar. He cambiado algo...

SELECT p2.producto, p2.id_proveedor, p2.item_group, p2.costo_producto, cp.id_prensa, cp.id_cotiza, cp.volumen, cp.cant_item, cp.item, cp.precio_item, cp.monto_item FROM productos p2 LEFT JOIN calc_prens cp ON p2.producto = cp.item INNER JOIN (SELECT p.producto as PROD FROM productos p INNER JOIN calc_prensa c ON p.producto = c.item WHERE p.item_group = 2 AND c.id_cotiza = 36)T1 ON p2.producto = T1.PROD

Si la relación se establece entre otros campos, debes decirlo para corregir la sintaxis. En cualquier caso, si no funciona haznos llegar la estructura de la base con sus tablas y algunos datos para que hagamos alguna prueba y podamos enviarte alguna sugerencia.

Prueba primero esta consulta:
SELECT p.producto as PROD FROM productos p INNER JOIN calc_prensa c ON p.producto = c.item WHERE p.item_group = 2 AND c.id_cotiza = 36
para ver si se encuentran datos...

Luego lanza la otra.
  #7 (permalink)  
Antiguo 08/09/2008, 14:49
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 1
Gracias por tu paciencia

Bueno fijate si corro la consulta SELECT p.producto as PROD FROM productos p INNER JOIN calc_prensa c ON p.producto = c.item WHERE p.item_group = 2 AND c.id_cotiza = 36 me trae los solo los productos de la tabla productos que se encuentran en la tabla calc_prensa con el el item_group y el c.id_cotiza indicado. no trae la totalidad de los productos de la tabla "producto"

Al ejecutar la otra consulta me trae lo mismo, adicionando todos los campos extras lo que es decir todos los campos de ambas tablas que coinciden, mas no me trae la totalidad de la tabla productos, y en esta ocasion tampoco lo filtra por el
c.id_cotiza indicado.

Acá te colocó te todas formas las estructuras de las tablas. Gracias nuevamente y ya estoy en deuda contigo.

CREATE TABLE `calc_prensa` (
`id_prensa` int(7) NOT NULL auto_increment,
`id_cotiza` int(7) default NULL,
`volumen` int(9) NOT NULL,
`cant_item` int(11) default NULL,
`item` varchar(200) collate utf8_spanish_ci default NULL,
`precio_item` float default NULL,
`monto_item` float default NULL,
PRIMARY KEY (`id_prensa`),
KEY `id_item` (`item`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci MIN_ROWS=48 COMMENT='InnoDB free: 4096 kB; (`id_item`) REFER `sisco/item`(`id_ite' AUTO_INCREMENT=40 ;


INSERT INTO `calc_prensa` (`id_prensa`, `id_cotiza`, `volumen`, `cant_item`, `item`, `precio_item`, `monto_item`) VALUES
(1, 36, 100, 1, 'Negativos 1/8', 14, 0),
(2, 36, 100, 4, 'Negativos 1/4', 22, 0),
(3, 36, 100, 7, 'Negativos 1/3', 28, 0),
(4, 36, 100, 1, 'Negativos 1/2', 42, 0);


CREATE TABLE `productos` (
`id_producto` int(6) NOT NULL auto_increment,
`id_proveedor` int(6) NOT NULL,
`producto` varchar(255) character set latin1 collate latin1_general_ci NOT NULL,
`item_group` int(1) default NULL,
`costo_producto` float NOT NULL,
PRIMARY KEY (`id_producto`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci AUTO_INCREMENT=52 ;



INSERT INTO `productos` (`id_producto`, `id_proveedor`, `producto`, `item_group`, `costo_producto`) VALUES
(1, 0, 'Negativos 1/8', 2, 14),
(2, 0, 'Negativos 1/4', 2, 22),
(3, 0, 'Negativos 1/3', 2, 28),
(4, 0, 'Negativos 1/2', 2, 42),
(5, 0, 'Negativos 1/1', 2, 80),
(6, 0, 'Negativos Extra Pliego', 2, 90),
(16, 0, 'Horas SAKURAI 2 Colores', 3, 200),
(17, 0, 'Horas SAKURAI 4 Colores', 3, 300),
(18, 0, 'Arreglos SAKURAI', 3, 300),
(19, 0, 'Tintas (Kilos)', 3, 60);
  #8 (permalink)  
Antiguo 08/09/2008, 15:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Error en Left Join

Prueba esto. El error fue mío, pues no me di cuenta de que hacían falta dos LEFT JOIN

SELECT p2.id_producto, p2.id_proveedor, p2.producto, p2.item_group, p2.costo_producto, cp.id_prensa, cp.id_cotiza, cp.volumen, cp.cant_item, cp.item, cp.precio_item, cp.monto_item
FROM productos p2
LEFT JOIN (

SELECT p.producto AS PROD
FROM productos p
INNER JOIN calc_prensa c ON p.producto = c.item
WHERE p.item_group =2
AND c.id_cotiza =36
)T1 ON p2.producto = T1.PROD
LEFT JOIN calc_prensa cp ON cp.item = T1.PROD


Quita luego los campos que no quieras mostrar. Y cuando veas NULL y no quieras verlo, en la selección pon IFNULL(nombrecampo, '-') en lugar del nombre que tengas... Sólo tienes que hacerlo en los campos de la tabla calc_prens, pues son los únicos en los que puede aparecer un NULL
  #9 (permalink)  
Antiguo 08/09/2008, 22:02
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 1
Consulta exitosa. pero...

Tio en verdad te agradezco toda la ayuda y ya estoy un pelin mas aliviado, pero cuando cuando ejecuto la consulta en el phpmyadmin me trae exactamente lo que deseo, y al llevar eso al php me dice "Query was empty" sera que no puedo acceder a la data tal como lo hacia siempre (cuando no hacia join). Te coloco el codigo a ver si me puedes ilustrar que estoy haciendo mal.

Código PHP:
$sqlprensa "SELECT p2.id_producto, p2.id_proveedor, p2.producto, p2.item_group, 
p2.costo_producto, cp.id_prensa, cp.id_cotiza, cp.volumen, cp.cant_item, cp.item, 
cp.precio_item, cp.monto_item FROM productos p2 LEFT JOIN (SELECT p.producto 
AS PROD FROM productos p INNER JOIN calc_prensa c ON p.producto = c.item  )T1 
ON p2.producto = T1.PROD LEFT JOIN calc_prensa cp ON cp.item = T1.PROD"


$pregprensa mysql_db_query($database,$sqlprensa) or die (mysql_error());

while (
$array_prei mysql_fetch_array($pregprensa)) {
 echo 
$array_prei[PROD]; // Acá no se si llamarlo por el alias, o 
//simplemente llamar a mi producto como siempre o tal vez tabla.item

Gracias por todo el esfuerzo y estoy a la orden para cualquier cosa que necesites.

Última edición por danikene; 08/09/2008 a las 22:06 Razón: correcion de titulo
  #10 (permalink)  
Antiguo 09/09/2008, 00:10
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 1
Respuesta: Error en Left Join

Listo Jurena ya logre resolver lo de "Query was empty" en realidad era un error de otra consulta que tengo en el mismo archivo. Lo unico que no se como hacer es llamar los registros de la consulta
Código PHP:
while ($array_prei mysql_fetch_array($pregprensa)) {
echo 
$array_prei[PROD]; // Acá no se como llamar al registro

  #11 (permalink)  
Antiguo 09/09/2008, 00:10
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Error en Left Join

Ahora es un problema PHP. Ya he visto cómo resolverlo, pero no puedo contestarte en este foro. Abre un nuevo post en PHP y lo resolveremos. Pon también la parte de la conexión a la base; ah, y no hace falta que pongas ALIAS.
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 11:28.