It's probably your JOIN on shipped items producing a cross product with 
your JOIN on ordered items.  What happens if you take the entire 
"shippeditems" JOIN out of your statement? Are your numbers still off? 
Since your query is not using data from that table you should be able to 
eliminate it from your join without introducing any errors.

You should be able to see the duplication of records if you run this 
query:

SELECT o.orderid
        , c.customerid
        , oi.itemid
        , oi.productid
        , oi.quantity
        , si.shippingid
        , si.productid
        , si.shippedqty
FROM orders o
INNER JOIN customers c
        on c.id = o.customerid
LEFT JOIN orderitems oi
        on o.orderid = oi.orderid
LEFT JOIN shippeditems si
        on o.orderid = si.orderid
WHERE o.orderid = <some orderid with the wrong results>

I think that when you look at this you will see that some of the 
orderitems and/or shippeditems will be duplicated.

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine


Ville Mattila <[EMAIL PROTECTED]> wrote on 01/03/2005 07:18:16 
AM:

> Hi there!
> 
> I have some problems with the complex MySQL join operations. In most 
> cases, LEFT JOIN fulfills my needs but sometimes it doesn't work in the 
> expected way. I'll give an example:
> 
> orders
> ------
> - orderid
> - customerid
> 
> customers
> ---------
> - id
> - customername
> 
> orderitems
> ----------
> - itemid
> - orderid
> - productid
> - quantity
> 
> shippeditems
> ------------
> - shippingid
> - orderid
> - productid
> - shippedqty
> 
> Now I try to find out a list of orders, giving also the quantity of 
> shipped and unshipped products in the list.
> 
> SELECT o.*,c.customername, SUM(oi.quantity) orderedTotal, 
> SUM(si.shippedqty) shippedTotal
>      FROM orders o
>      LEFT JOIN customers c ON (c.id = o.customerid)
>      LEFT JOIN orderitems oi ON (oi.orderid = o.orderid)
>      LEFT JOIN shippeditems si ON (si.orderid = o.orderid)
>    GROUP BY o.orderid ORDER BY o.orderid;
> 
> This query returns all other information correct but the SUM functions 
> return too large numbers.
> 
> Why I'm not able to user "normal" JOIN, is that I need also order 
> information in that case that no items are shipped.
> 
> Thanks for your tips!
> 
> Ville
> 
> -- 
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]
> 

Reply via email to