Trier les résultats - mysql

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par poupilou, 7 Mai 2012.

  1. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    935
    J'aime reçus:
    15
    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:
     
  2. 5_legs
    5_legs WRInaute passionné
    Inscrit:
    30 Avril 2006
    Messages:
    1 521
    J'aime reçus:
    0
    Bonsoir,

    As-tu essayé quelque chose comme

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

    5_legs
     
  3. iLuc
    iLuc WRInaute discret
    Inscrit:
    14 Avril 2009
    Messages:
    112
    J'aime reçus:
    0
    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 
    
     
  4. 5_legs
    5_legs WRInaute passionné
    Inscrit:
    30 Avril 2006
    Messages:
    1 521
    J'aime reçus:
    0

    Edit : j'ai oublié le from table mais bon tu l'avais vu je suppose ;)
     
  5. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    935
    J'aime reçus:
    15
    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.
     
  6. UsagiYojimbo
    UsagiYojimbo WRInaute accro
    Inscrit:
    23 Novembre 2005
    Messages:
    12 011
    J'aime reçus:
    133
    Et la même sans le max(date) ?

    Code:
    Select nom_produit, date, max(prix)
    from table
    Group by nom_produit
    
    ?
     
  7. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    935
    J'aime reçus:
    15
    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.
     
  8. Protée
    Protée WRInaute occasionnel
    Inscrit:
    27 Décembre 2006
    Messages:
    301
    J'aime reçus:
    0
    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
    
     
  9. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    935
    J'aime reçus:
    15
    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...
    
     
  10. iLuc
    iLuc WRInaute discret
    Inscrit:
    14 Avril 2009
    Messages:
    112
    J'aime reçus:
    0
    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
    
    



    ;-)
     
  11. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    935
    J'aime reçus:
    15
    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
     
  12. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    935
    J'aime reçus:
    15
    J'ai crié victoire trop tôt, ma requête ne trie pas les résultats comme il faut :(
     
  13. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 021
    J'aime reçus:
    1
    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);
     
  14. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    935
    J'aime reçus:
    15
    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.
     
  15. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 021
    J'aime reçus:
    1
    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 ?
     
  16. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 021
    J'aime reçus:
    1
    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
     
  17. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    935
    J'aime reçus:
    15
    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
     
  18. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    935
    J'aime reçus:
    15
    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:
     
  19. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 021
    J'aime reçus:
    1
    C'est aussi ce que dit ma femme :D je sais pas si c'est un compliment :lol:
     
  20. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    935
    J'aime reçus:
    15
    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: )
     
Chargement...
Similar Threads - Trier résultats mysql Forum Date
[mysql] trier les résultats d'une requête selon une table non liée à la requête Développement d'un site Web ou d'une appli mobile 15 Avril 2011
Google dispose-t-il d'un référentiel géographique pour trier ses résultats Référencement Google 28 Septembre 2010
Filtrer ou trier les résultats d’une requête Google par date Crawl et indexation Google, sitemaps 13 Avril 2008
Comment trier les visiteurs pour connaitre son taux de conversion réel? e-commerce 24 Septembre 2014
Précautions fermer un blog externe et "rapatrier" articles Débuter en référencement 25 Juin 2014
Fonction die un peu trop meurtrière Développement d'un site Web ou d'une appli mobile 1 Avril 2014
MySQL : comment grouper les entrées puis les trier ? Développement d'un site Web ou d'une appli mobile 21 Mars 2011
Trier un array et catégoriser les infos (ou requêtes multiples ?) Développement d'un site Web ou d'une appli mobile 6 Juillet 2010
Trier un tableau en PHP Développement d'un site Web ou d'une appli mobile 9 Juin 2010
Trier un tableau par rapport à un autre Développement d'un site Web ou d'une appli mobile 5 Février 2010
Trier les backlinks d'un site en fonction d'un mot clé Débuter en référencement 5 Novembre 2009
Trier enregistrement en javascript Développement d'un site Web ou d'une appli mobile 4 Novembre 2009
Rapatrier un compte GMail sur un autre compte Google Gmail, Google Talk, Blogger et Orkut 19 Novembre 2008
2 URL pour un server.... comment trier? URL Rewriting et .htaccess 9 Octobre 2008
Comment Trier dans 2 tables? Développement d'un site Web ou d'une appli mobile 5 Octobre 2008
Analytics : plusieurs codes pour trier par secteur? Google Analytics 1 Avril 2008
Trier des données avec les tableaux Développement d'un site Web ou d'une appli mobile 31 Octobre 2006
Trier les données avec SUM() Développement d'un site Web ou d'une appli mobile 21 Juillet 2006
.HTACCESS ignoré - mettez moi le pied a l'étrier URL Rewriting et .htaccess 11 Juillet 2006
[résolu] PHP-Trier un tableau en fonction d'un critére perso Développement d'un site Web ou d'une appli mobile 10 Juillet 2006