web-dev-qa-db-fra.com

Comment faire une jointure "distincte" avec MySQL

Je souhaite rejoindre deux tables MySQL (historique des produits et des prix):

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

Je peux effectuer un 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;

Mais comme prévu, si j'ai plusieurs entrées pour un produit dans la table d'historique des prix, j'obtiens un résultat pour chaque prix historique.

Comment une structure peut-elle créer une jointure qui ne renverra qu'une instance de chaque produit avec uniquement l'entrée la plus récente de la table d'historique des prix qui lui est associée?

19
Steven Potter

Utilisation:

   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
24
OMG Ponies

Essaye ça:

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
3
Justin Ethier
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));
3
a1ex07

Pourquoi ne pas rester simple et rapide:

SELECT 
 Product.UPC, Product.Name, Price_h.Price, Price_h.Date
FROM 
 Product
LEFT JOIN 
 Price_h
 ON Product.Id = Price_h.Product_id;
ORDER BY
 Price_h.Date DESC
LIMIT 1
0
Henry
SELECT n.product_id, 
       n.product_name,
       n.product_articul,
       n.product_price,
       n.product_discount,
       n.product_description, 
       n.product_care,
       (SELECT photo_name FROM siamm_product_photos WHERE product_id = n.product_id LIMIT 1) AS photo_name
FROM siamm_product as n;
0
vlnik