I wasn't too sure how to present this question to keep it consise while still giving plenty of info to work with. If any one needs more info/tables let me know and I'开发者_开发百科ll be happy to edit.
I'm trying to query a database and need to join several tables to get the data I want.
The query is: Show me amount of items from supplier x that were sold between two dates and how many of them are currently in stock.
The SQL for this is as follows:
SELECT p.id as product_id, p.description as description, SUM(col.quantity) as qty, SUM(s.stocklevel) as stocklevel, sup.name as supplier from products as p
LEFT JOIN customerorderlines as col on col.product_id = p.id
LEFT JOIN customerorders as co on co.id = col.customerorder_id
LEFT JOIN stock as s on s.product_id = p.id
LEFT JOIN suppliers as sup on sup.id = p.supplier_id
WHERE co.orderdate BETWEEN '2009-07-01' AND '2009-08-01'
AND p.supplier_id = 51
GROUP by col.product_id
ORDER by SUM(col.quantity)
DESC
Here is one of the rows it retuns:
product_id description qty stocklevel supplier
24376 Streaker Wax Paper Strips 330 3510 Rand Rocket Ltd
Notice stocklevel returning 3510.
Now lets take a look at this on its own:
SELECT SUM(stocklevel) from stock where product_id = 24376
SUM(stocklevel)
90
With my limited mysql knowledge, I have no idea why it is doing this. Any suggestions are extremly appreciated.
Thanks in advance.
You are most likely counting several product_id's stocklevels multiple times.
One solution would be to pre-compute the stocklevel for each product_id and join this with your original query.
SELECT p.id as product_id
, p.description as description
, SUM(col.quantity) as qty
, sl.stocklevel as stocklevel
, sup.name as supplier
from products as p
INNER JOIN (
SELECT product_id, SUM(stocklevel) as stocklevel
from stock
GROUP BY product_id
) sl ON sl.product_id = p.product_id
LEFT JOIN customerorderlines as col on col.product_id = p.id
LEFT JOIN customerorders as co on co.id = col.customerorder_id
LEFT JOIN stock as s on s.product_id = p.id
LEFT JOIN suppliers as sup on sup.id = p.supplier_id
WHERE co.orderdate BETWEEN '2009-07-01' AND '2009-08-01'
AND p.supplier_id = 51
GROUP by col.product_id, sl.stocklevel
ORDER by SUM(col.quantity) DESC
SELECT prod.id as product_id, prod.description as description,
SUM(col.quantity) as qty, SUM(sup.stocklevel) as stocklevel,
sup.name as supplier, sup.id
FROM product prod
INNER join suppliers sup as sup.id = prod.supplier_id
LEFT join stock stk as stk.product_id = prod.id
LEFT JOIN customerorderlines as col on col.product_id = prod.id
LEFT JOIN customerorders as co on co.id = col.customerorder_id
WHERE co.orderdate BETWEEN '2009-07-01' AND '2009-08-01'
GROUP BY sup.id, prod.id
ORDER by SUM(col.quantity) DESC
精彩评论