2012-03-15 7 views
9

Estoy tratando de enumerar las variaciones del producto con sus cantidades pedidas, PERO TAMBIÉN se muestran las variaciones del producto donde no hay una cantidad solicitada. Así que pensé que sería tan simple como seleccionar los productos y hacer un join de izquierda en los pedidos de cada producto donde el pedido es una revisión actual.La combinación de combinación izquierda/interna de Mysql no funciona como se esperaba

Así que esperar, como en este orden de operaciones:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN `product_orders` po ON p.product_id=po.product_id 
LEFT JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1' 

pero que está recibiendo también las cantidades en que el is_current no es 1 Entonces pensé, bien, yo sólo puedo hacer una unión interna después de la izquierda unirse a su lugar de esta manera:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN `product_orders` po ON p.product_id=po.product_id 
INNER JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1' 

, pero luego no se enumeran los productos que no han sido ordenados todavía. Esperaba que aparecieran como SUM (cantidad) siendo NULL. ¿Alguien puede ver dónde ha salido mal mi lógica? Gracias! de Scott

Respuesta

4

Si los únicos pedidos de productos que cuentan son aquellos en los que es actual, entonces usted necesita para encontrar ese subconjunto antes haces una izquierda unirse a ella . De lo contrario, si haces una combinación izquierda, obtienes todas o solo las ordenadas como has descubierto.

así que algo como lo siguiente debe funcionar:

select p.productid, sum(po.quantity) 
from products p 
left outer join (select po.productid, po.quantity 
         from productorders po 
         inner join orders o on o.orderid = po.orderid and o.iscurrent = 1) po on po.productid = p.productid 
group by p.productid 
+0

tiene sentido, lo intentaré ... un segundo – scott

+0

Perfecto, ¡funciona genial! ! Exactamente lo que se necesitaba. ¡Muchas gracias! – scott

+0

No hay problema. Estabas en el camino correcto; solo necesitaba un paso adicional – kaj

0

Try agrupación por su identificador de producto:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN `product_orders` po ON p.product_id=po.product_id 
INNER JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1' 
GROUP BY p.product_id 
+0

Gracias por la respuesta, solo se enumeran los productos que tienen al menos la cantidad pedida de uno (por lo que aparece en la tabla product_orders) – scott

+0

¿Funciona si cambia el 'INNER JOIN' a 'LEFT JOIN'? – Alp

+0

Sí, la consulta funciona, pero también obtengo todas las cantidades para is_current! = '1' (entonces revisiones más antiguas del mismo orden) – scott

18

Si bien la respuesta de Kaj es correcto, no es necesariamente ideal, ya que MySQL tiende a omitir la utilización de los índices cuando se utilizan tablas derivadas (sub-selecciona). Al menos, este es mi entendimiento. Puede seguir utilizando su metodología de utilizar UNE si coloca los puntos de unión entre paréntesis:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN (`product_orders` po 
    INNER JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1') 
ON p.product_id=po.product_id; 

Sólo recuerda que la cláusula ON para el LEFT JOIN tiene que venir después del paréntesis. ¡Espero que esto ayude!

+0

Lo siento, no uso stackoverflow con mucha frecuencia, y no sé cómo poner el código en su propia sección. – Chosun

+0

A veces omito el excelente punto que hizo con respecto a los índices y sub selecciones. Buena explicación. – mkralla11

+0

¡Gracias! Hago lo que puedo ... ja. – Chosun

Cuestiones relacionadas