views:

43

answers:

3

I have two MySQL tables (product and price history) that I would like to join:

Product Table: Id = int Name = varchar Manufacturer = varchar UPC = varchar Date_added = datetime

Price_h table: Id = int Product_id = int Price = int Date = datetime

I can perform a simple Left Join:

SELECT Product.UPC, Product.Name, Price_h.Price, Price_h.Date
FROM Product
LEFT JOIN Price_h
ON Product.Id = Price_h.Product_id;

But as expected if I have more than one entry for a product in the price history table, I get one result for each historical price.

How can a structure a join that will only return one instance of each produce with only the newest entry from the price history table joined to it?

+1  A: 

Try this:

SELECT Product.UPC, Product.Name, Price_h.Price, MAX(Price_h.Date)
 FROM Product
 INNER JOIN Price_h
   ON Product.Id = Price_h.Product_id
GROUP BY Product.UPC, Product.Name, Price_h.Price
Justin Ethier
That'd work but it wouldnt give him the correct price history entry that corresponds with the max(date)...
Ariel
This query returns Max(date) for each (Product.UPC+Product.Name+Price_h.Price). It is not the latest price for the product.
a1ex07
Ariel and a1ex07 are correct. This query does manage to return the correct date, but not the correct price.
Steven Potter
+1  A: 
SELECT Product.UPC, Product.Name, Price_h.Price, Price_h.Date
FROM Product
LEFT JOIN Price_h
ON (Product.Id = Price_h.Product_id AND Price_h.Date = 
  (SELECT MAX(Date) FROM Price_h ph1 WHERE ph1.Product_id = Product.Id));
a1ex07
+1: Though not a fan of the correlated subquery on the JOIN
OMG Ponies
+1  A: 

Use:

   SELECT p.upc,
          p.name,
          ph.price,
          ph.date
     FROM PRODUCT p
LEFT JOIN PRICE_H ph ON ph.product_id = p.id
     JOIN (SELECT a.product_id, 
                  MAX(a.date) AS max_date
             FROM PRICE_H a
         GROUP BY a.product_id) x ON x.product_id = ph.product_id
                                 AND x.max_date = ph.date
OMG Ponies
+1: It should be faster than mine. Though longer code.
a1ex07
I understand why you say it should be faster, but I have yet to find a circumstance where it is. I think it may have something to do with the large number of records I have in the price history table (3.5M). Perhaps it would help if I added an index to the Price_h.date column?
Steven Potter
It seems that this query takes approximately the same amount of time no matter how many results it returns whereas a1ex07's query takes longer with increased results, as would be expected. I was just a little surprised at how slow this is for small result sets and how fast a1ex07's solution is for the same small results set. Since in the "Real world" I will be working with rather large result sets I have selected this as the answer.
Steven Potter