Trier les résultats - mysql

WRInaute impliqué
Salut à tous,

J'ai un petit souci avec une requête mysql, je ne trouve pas la solution :(

Je souhaite trouver le prix le plus grand en fonction de la dernière date correspondante à ce produit, ma table est structurée de cette manière (ellle contient plusieurs dizaine de milliers de lignes) :

Code:
num - nom_produit - date - prix
1 - produit1 - 2007-01-01 - 1100
2 - produit1 - 2008-01-01 - 1200
3 - produit3 - 2010-08-01 - 800
4 - produit3 - 2011-07-01 - 850
5 - produit4 - 2008-03-01 - 700
6 - produit4 - 2009-03-01 - 750
7 - produit4 - 2012-05-01 - 820
8 - produit5 - 2012-05-01 - 900
9 - produit1 - 2012-05-01 - 1000

Si un prix n'augmente pas un mois, il n'y aura pas de ligne ajouté dans cette table. Donc on peut avoir pour un produit un prix ayant une date inférieure à la date d'aujourd'hui, par exemple le produit3 a pour dernière date le 2011-07-01. Un prix peut augmenter un mois et baisser le mois suivant, ou l'inverse.

Quelle serait la requète mysql qui me trierai mes produits en fonction de leur prix (du plus grand, au moins grand) en fonction de la dernière date correspondante à ce produit ?

Quelqu'un peut-il m'aider ? J'ai fait tourné en boucle mes 2 neurones pendant plusieurs jours mais je n'ai pas trouvé :?

D'avance un grand merci :wink:
 
WRInaute passionné
Bonsoir,

As-tu essayé quelque chose comme

Select nom_produit, max(date), max(prix)
Group by nom_produit

5_legs
 
WRInaute discret
Bonsoir,

Je pense une requet de ce genre :
( Aide toi, de phpMyadmin pour mettre au point ta requet. ;-) )

Code:
SELECT
table.num,
table.nom_produit,
table.date,
table.prix

FROM
table

HAVING
table.date = MAX(table.date);

ORDER BY table.prix ASC  // par ordre croissant. Utilise DESC pour ordre decroissant
 
WRInaute passionné
5_legs a dit:
Bonsoir,

As-tu essayé quelque chose comme

Select nom_produit, max(date), max(prix)
Group by nom_produit

5_legs


Edit : j'ai oublié le from table mais bon tu l'avais vu je suppose ;)
 
WRInaute impliqué
Merci pour vos réponses.

J'ai essayé vos 2 requêtes mais ça ne trie pas comme il le faudrait :(

Le problème du "max(date), max(prix)" c'est qu'il me sélectionne les dates maximum ainsi que les prix maximum, alors que parfois le prix maximum peut avoir une date inférieure à celle d'aujourd'hui : le produit1 (dans mon exemple) à un prix de 1000 à la date d'ajourd'hui mais son prix maximum de 1200 est en date du 2008-01-01

J'ai essayé aussi avec le having dans la requête mais ça ne marche pas non plus :(

Avez-vous d'autres pistes ?

Merci pour votre aide.
 
WRInaute accro
Et la même sans le max(date) ?

Code:
Select nom_produit, date, max(prix)
from table
Group by nom_produit

?
 
WRInaute impliqué
C'est la même chose, ça va trier uniquement sur le max(prix) et ça ne prendra pas en compte le tri sur la dernière date présente pour ce produit dans la table.

Il faudrait créer une requête qui va trier par date (de la plus récente à la plus ancienne) et ensuite rechercher le prix le plus haut pour chaque catégorie de produits.

Un produit aura une nouvelle ligne dans cette table que si son prix à évolué le mois précédent, donc ce produit peut très bien avoir comme date la plus récente une date différente d'un autre produit. Par exemple, l'un aura comme date la plus récente le 2011-12-01 et un autre le 2012-03-01. Je met à jour les prix de mes produits une fois par mois.
 
WRInaute occasionnel
Bonjour poupilou,

peux-tu nous aider à visualiser le résultat que tu souhaites obtenir ?
Essayons d'être concret. Si tu prends cet exemple (donné plus haut), quel résultat veux-tu obtenir précisément ?

Code:
num - nom_produit - date - prix
1 - produit1 - 2007-01-01 - 1100
2 - produit1 - 2008-01-01 - 1200
3 - produit3 - 2010-08-01 - 800
4 - produit3 - 2011-07-01 - 850
5 - produit4 - 2008-03-01 - 700
6 - produit4 - 2009-03-01 - 750
7 - produit4 - 2012-05-01 - 820
8 - produit5 - 2012-05-01 - 900
9 - produit1 - 2012-05-01 - 1000
 
WRInaute impliqué
J'aimerai obtenir le résultat ci-dessous trié dans cet ordre :

Code:
produit1 - 2012-05-01 - 1000
produit5 - 2012-05-01 - 900
produit3 - 2011-07-01 - 850
produit4 - 2012-05-01 - 820
etc...
 
WRInaute discret
poupilou a dit:
J'aimerai obtenir le résultat ci-dessous trié dans cet ordre :

Code:
produit1 - 2012-05-01 - 1000
produit5 - 2012-05-01 - 900
produit3 - 2011-07-01 - 850
produit4 - 2012-05-01 - 820
etc...

Je crois qu'il faut concaténer une requet ( je sais pas si ça ce dis en SQL ?? :oops: )

Tu sélectionnes les prix Maxi par dates.
Dans la requête il faut limiter à "une" sélection ( par dates ). ( on sélectionne le prix maxi pour chaque date )
Et ensuite, tu les affiches par ordre de prix décroissant...

Je jette un Oeil, j'avais fait quelque chose un peux de ce genre il y a quelque temps.
Faut que je regarde, je te tiens au courant.



Edit :


Je crois qu'il faut faire quelque chose de ce genre, si j'ai bien compris :

Code:
SELECT table.num, table.nom_produit, table.date, table.prix
FROM table
GROUPE BY table.prix
HAVING table.date IN (SELECT MAX(table.prix)
                      FROM table 
                      GROUP BY table.prix)

ORDER BY table.prix DESC




;-)
 
WRInaute impliqué
Merci pour ta réponse Luc.

J'ai trouvé la solution, en faite il faut utiliser à la fois le Group By et le Order BY avec un double trie dans le Order By, comme ceci :

Code:
SELECT * FROM table WHERE prix>0 GROUP BY nom_produit ORDER BY prix DESC, date DESC

En tout les cas merci pour votre aide, ça faisait un bout de temps que cette requête m'énervait, je vais mieux dormir la nuit :D
 
WRInaute accro
Il faut dans un premier temps extraire le prix max pour chaque produit (le but de ta recherche) sur une requête pour ensuite solliciter la table afin de ressortir les données complétés dans un ordre trié, la liaison requête sous requête se faisant par exemple sur l'intitulé du produit :

SELECT
A.m_produit, A.m_date, A.prix
FROM
m_table AS A
WHERE
A.prix IN (SELECT MAX(prix) FROM m_table AS B WHERE A.m_produit = B.m_produit)
ORDER BY A.prix DESC

ce qui donne :

produit1 2008-01-01 1200
produit5 2012-05-01 900
produit3 2011-07-01 850
produit4 2012-05-01 820

pour ceux qui veulent tester :

Code:
CREATE TABLE IF NOT EXISTS `m_table` (
  `num` int(11) NOT NULL auto_increment,
  `m_produit` text collate latin1_german2_ci NOT NULL,
  `m_date` date NOT NULL,
  `prix` int(11) NOT NULL,
  KEY `num` (`num`)
) ENGINE=MyISAM;

INSERT INTO `m_table` (`num`, `m_produit`, `m_date`, `prix`) VALUES
(1, 'produit1', '2007-01-01', 1100),
(2, 'produit1', '2008-01-01', 1200),
(3, 'produit3', '2010-08-01', 800),
(4, 'produit3', '2011-07-01', 850),
(5, 'produit4', '2008-03-01', 700),
(6, 'produit4', '2009-03-01', 750),
(7, 'produit4', '2012-05-01', 820),
(8, 'produit5', '2012-05-01', 900),
(9, 'produit1', '2012-05-01', 1000);
 
WRInaute impliqué
Merci pour ta réponse zeb mais les résultats que l'on souhaite obtenir doivent être triés dans cet ordre :

Code:
produit1 - 2012-05-01 - 1000
produit5 - 2012-05-01 - 900
produit3 - 2011-07-01 - 850
produit4 - 2012-05-01 - 820
etc...

La date la plus récente prime sur le prix le plus haut. Dans notre exemple ci-dessous le produit1 a un prix de 1200 à la date du 2008-01-01 mais ce produit a un prix de 1000 à la date (plus récente) de 2012-05-01. Il est donc le produit le plus cher des autres produits à la date de 2012-05-01.
 
WRInaute accro
quel est la condition qui permet de décider si le prix le plus haut est le critère a prendre en compte OU si c'est la date ?
 
WRInaute accro
Ok je viens de comprendre en fait c'est pas le prix qui doit servir de maxima mais la date :

SELECT A.m_produit, A.m_date, A.prix FROM m_table as A WHERE A.m_date in (SELECT MAX(m_date) FROM m_table as B WHERE A.m_produit = B.m_produit) ORDER By A.prix DESC

ce qui donne :

Code:
produit1	2012-05-01 	1000
produit5	2012-05-01 	900
produit3	2011-07-01 	850
produit4	2012-05-01 	820

et ce qui change pas grand chose au principe
 
WRInaute impliqué
1) classement des produits en fonction de la date la plus récente.

2) quel est le prix le plus haut de tout les produits en fonction de cette date la plus récente. Sachant que cette date variera en fonction des produits.

BRAVO zeb, t'a trouvé :D
 
WRInaute impliqué
Non vraiment encore merci zeb (et les autres) pour ton(votre) aide, ça marche nickel... mais il faut quand que tu saches que c'est à caude de mec comme toi (zeb) qu'on se sent bête : on a pas le même cerveau :mrgreen:
 
WRInaute impliqué
zeb a dit:
je sais pas si c'est un compliment :lol:

Elle peut être fier d'avoir un "cerveau" qui partage sa vie.... et tout les cas, moi j'aurais jamais trouvé cette requête avec mes 2 neurones, même si je les avais fait tourné en boucle pendant une très très... longue période (c'est ce que j'ai fait d'ailleurs, hoin, hoin.... et j'ai pas trouvé :mrgreen: )
 
Discussions similaires
Haut