In article <[EMAIL PROTECTED]>,
Ville Mattila <[EMAIL PROTECTED]> writes:

> When I try to find out the current amount of products in our stock,
> and ordered quantities I use this query:


> SELECT p.id, SUM(out.quantity) ordered_out, SUM(in.quantity)
> ordered_in FROM products p LEFT JOIN outorders out ON (out.productid =
> p.id) LEFT JOIN inorders (in.productid = p.id);


> Even I have only one "OutOrder" for certain product, I get ordered_out
> value as 2. ordered_in value is anyway correct. If I remove all things
> related to "InOrders" I will get correct result to ordered_out.


> Have I missed something? Isn't LEFT JOIN the correct query to join
> tables to the "main" table (in this case products)?

Drop the sum() aggregate and you'll see what went wrong:  you get the
same "out" row for every matching "in" row and vice versa; thus your
sums are in general multiples of the correct values.  To remedy that,
you need a division:

  SELECT p.id,
         SUM(out.quantity) / COUNT(DISTINCT in.id) ordered_out,
         SUM(in.quantity) / COUNT(DISTINCT out.id) ordered_in
  FROM products p
  LEFT JOIN outorders out ON out.productid = p.id
  LEFT JOIN inorders ON in.productid = p.id
  GROUP BY p.id;


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to