2010-05-06 7 views
4

J'ai une table de toutes les ventes sont définies comme:requête SQL pour obtenir le dernier enregistrement pour tous les articles distincts dans une table

mysql> describe saledata; 
+-------------------+---------------------+------+-----+---------+-------+ 
| Field    | Type    | Null | Key | Default | Extra | 
+-------------------+---------------------+------+-----+---------+-------+ 
| SaleDate   | datetime   | NO |  | NULL |  | 
| StoreID   | bigint(20) unsigned | NO |  | NULL |  | 
| Quantity   | int(10) unsigned | NO |  | NULL |  | 
| Price    | decimal(19,4)  | NO |  | NULL |  | 
| ItemID   | bigint(20) unsigned | NO |  | NULL |  | 
+-------------------+---------------------+------+-----+---------+-------+ 

Je dois obtenir le dernier prix de vente pour tous les articles (comme le prix peut changer). Je sais que je peux exécuter une requête comme:

SELECT price FROM saledata WHERE itemID = 1234 AND storeID = 111 ORDER BY saledate DESC LIMIT 1 

Cependant, je veux être en mesure d'obtenir le dernier prix de vente pour tous les articles (les ItemID s sont stockés dans une table d'éléments séparés) et les insérer dans un séparée table. Comment puis-je obtenir ces données? J'ai essayé des requêtes comme ceci:

SELECT storeID, itemID, price FROM saledata WHERE itemID IN (SELECT itemID from itemmap) ORDER BY saledate DESC LIMIT 1 

puis WRAP dans un insert, mais ce n'est pas obtenir les données appropriées. Y at-il une question que je peux courir pour obtenir le dernier prix pour chaque article et insérer cela dans une table définie comme:

mysql> describe lastsale; 
+-------------------+---------------------+------+-----+---------+-------+ 
| Field    | Type    | Null | Key | Default | Extra | 
+-------------------+---------------------+------+-----+---------+-------+ 
| StoreID   | bigint(20) unsigned | NO |  | NULL |  | 
| Price    | decimal(19,4)  | NO |  | NULL |  | 
| ItemID   | bigint(20) unsigned | NO |  | NULL |  | 
+-------------------+---------------------+------+-----+---------+-------+ 

Répondre

4

C'est le plus grand-n-par groupe problème qui revient souvent sur le débordement de pile.

INSERT INTO lastsale (StoreID, Price, ItemID) 
    SELECT s1.StoreID, s1.Price, s1.ItemID 
    FROM saledata s1 
    LEFT OUTER JOIN saledata s2 
    ON (s1.Itemid = s2.Itemid AND s1.SaleDate < s2.SaleDate) 
    WHERE s2.ItemID IS NULL; 
+0

Merci à Stackoverflow, en temps opportun trouvé – sansknwoledge

Questions connexes