Comment obtenir des lignes avec max date lors d'un regroupement dans MySQL?
J'ai un tableau avec les prix et les dates sur le produit:
id
product
price
date
Je crée un nouveau record lors de changement de prix. Et j'ai un tableau comme ceci:
id product price date
1 1 10 2014-01-01
2 1 20 2014-02-17
3 1 5 2014-03-28
4 2 25 2014-01-05
5 2 12 2014-02-08
6 2 30 2014-03-12
Je veux obtenir le dernier prix de tous les produits. Mais quand je groupe avec "produit", je ne peux pas obtenir un prix à partir d'une ligne avec un maximum de date.
Je peux utiliser MAX()
, MIN()
ou COUNT()
fonction de la demande, mais j'ai besoin d'un résultat basé sur d'autres valeurs.
Je veux quelque chose comme cela dans final:
product price date
1 5 2014-03-28
2 30 2014-03-12
Mais je ne sais pas comment. Peut-être comme ceci:
SELECT product, {price with max date}, {max date}
FROM table
GROUP BY product
Vous devez vous connecter pour publier un commentaire.
Alternativement, vous pouvez avoir des sous-requête pour obtenir la dernière version d'obtenir pour chaque produit et de rejoindre le résultat sur la table elle-même pour obtenir les autres colonnes.
Je pense que le plus simple est une
substring_index()
/group_concat()
astuce:Une autre façon, qui pourrait être plus efficace que la
group by
est:Ce dit: "donnez-moi toutes les lignes de la table où le même produit n'est pas un grand jour." C'est une façon élégante de dire "donnez-moi la ligne avec la date maximale pour chaque produit."
Remarque qu'il y a une différence subtile: la deuxième forme renvoie toutes les lignes que sur la date maximum, si il y a des doublons.
Aussi, pour l'exécution d'un index sur
table(product, date)
est recommandé.Vous pouvez utiliser une sous-requête des groupes par produit et retourner la date maximale pour chaque produit, et de se joindre à la sous-requête retour à la table produits: