MySQL : grouper les entrées puis les trier

MySQL : grouper les entrées puis les trier - SQL/NoSQL - Programmation

Marsh Posté le 21-03-2011 à 16:40:52    

Bonjour,
 
J'ai une table de ce type
http://img40.imageshack.us/img40/8640/tablea.gif
Et je voudrais obtenir une liste des meilleurs prix pour chaque modèle et classés par modèle, soit avoir le résultat suivant :
 
Audi A3 5600
Peugeot 308 2265
Renault Clio 1346
Renault Fluence 4635
Renault Kangoo 2569
Renault Twingo 1280
 
Et bha j'y arrive aps  :??:  
J'ai fait un SELECT DISTINCT avec un GROUP BY mais le GROUP BY me renvoie les valeurs qu'il veut.
J'ai fait avec une table temporaire mais ça marche pas.
 
Que faut il faire ? Une sous requête ?
 
Faut savoir aussi que la table contient 15 000 entrées (et que le résultat est mis en cache).
 
Merci à vous !


---------------
Bha ouais mais bon, m'enfin quoi...
Reply

Marsh Posté le 21-03-2011 à 16:40:52   

Reply

Marsh Posté le 21-03-2011 à 17:51:55    

SELECT Marque, Modele, Min(Prix) FROM MaTable GROUP BY Marque, Modele
 
Ca le fait pas?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 21-03-2011 à 18:02:11    

[:shimay:1] Il semblerait que si
 
Truc de fou que ce soit si simple, j'étais parti sur un truc idem hier mais je ne savais pas qu'on pouvait faire GROUP BY machin, truc !
 
Je teste et je te dis ça, merci !
 
Quand je pense que j'étais parti sur une table temporaire et des requetes de partout [:dovakor loves you:4]


---------------
Bha ouais mais bon, m'enfin quoi...
Reply

Marsh Posté le 21-03-2011 à 18:08:16    

NAN ça marche pas, je me disais bien que j'avais testé, ça me renvoie n'importe quel prix :(


---------------
Bha ouais mais bon, m'enfin quoi...
Reply

Marsh Posté le 21-03-2011 à 18:33:07    

non ça doit renvoyer me prix  le plus bas pour chaque vehicule


Message édité par flo850 le 21-03-2011 à 18:33:19

---------------

Reply

Marsh Posté le 21-03-2011 à 18:35:28    

Et bien non et c'est d'ailleurs un souci expliqué ici :( http://cedric-duprez.developpez.co [...] -group-by/


---------------
Bha ouais mais bon, m'enfin quoi...
Reply

Marsh Posté le 21-03-2011 à 18:42:42    

non  
le lien que tu donnes explique ce qui se passe quand certaines colonnes ne sont ni dans e group by , ni dans une fonction d'aggregat, comme mn/max/avg. En fait, c'est ce que tu faisait au debut  
 
dans ton cas actuel  
SELECT Marque, Modele, Min(Prix) FROM MaTable GROUP BY Marque, Modele
prix, qui n'est pas dans le group by est dans uen fonctione d'agreggat


---------------

Reply

Marsh Posté le 21-03-2011 à 18:46:43    

Ok je vais réessayer alors. Merci beaucoup en tout cas.
Par contre comment je peux limiter la plage de prix maintenant ? Genre entre 3000 et 5000 uniquement ?


---------------
Bha ouais mais bon, m'enfin quoi...
Reply

Marsh Posté le 21-03-2011 à 18:52:09    

having min(prix) >3000 and ...
 


---------------

Reply

Marsh Posté le 21-03-2011 à 19:10:36    

Franchement, merci à vous deux c'est hyper gentil vous êtes des boss.
 
Je connaissais même pas HAVING et je comprends même pas la différence avec order by mais ça marche !


---------------
Bha ouais mais bon, m'enfin quoi...
Reply

Marsh Posté le 21-03-2011 à 19:10:36   

Reply

Marsh Posté le 21-03-2011 à 19:12:45    

dans l'ordre :
les filtres du where s'applique
calcul des aggregats (group by )
les filtres du having s'appliquent ( ils peuvent donc s'appliquer sur les agregats)
tri des resultats( order by )
limitation du nombre de resultat ( limit )


---------------

Reply

Marsh Posté le 21-03-2011 à 20:22:26    

Merci ton message va droit dans mes favoris ;)


---------------
Bha ouais mais bon, m'enfin quoi...
Reply

Marsh Posté le 22-03-2011 à 10:26:42    

Le having, c'est en quelque sorte l'équivalent du Where sur le contenu remonté par le SELECT, après application du WHERE. Le WHERE fait un premier filtrage, le having un second, effetcivement souvent sur les agrégats, le WHERE ne pouvant le faire (ou alors via une sous-requête).
 
Pour la suite, tu devrais apprendre le SQL et d'une manière générale, les outils que tu manipules, ça te fera gagner du temps. Faire du sql sans connaître les clauses de base, c'est un peu dommage. Tu vas voir aussi que chaque SGBD a ses propres fonctions qui peuvent faire des trucs plus ou moins complexes, plus ou moins utiles/pratiques... ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 22-03-2011 à 10:31:22    

le having est un where appliqué après le group by
sans clause group by, un having est exactement equivalent à un where


Message édité par flo850 le 22-03-2011 à 10:32:31

---------------

Reply

Marsh Posté le 22-03-2011 à 11:01:33    

rufo a écrit :

Pour la suite, tu devrais apprendre le SQL et d'une manière générale, les outils que tu manipules, ça te fera gagner du temps. Faire du sql sans connaître les clauses de base, c'est un peu dommage. Tu vas voir aussi que chaque SGBD a ses propres fonctions qui peuvent faire des trucs plus ou moins complexes, plus ou moins utiles/pratiques... ;)

Oui je devrais mais bon ça ne m'éclate pas, je n'ai pas du tout le temps et pour moi ce n'est qu'un outil que j'utilise pour arriver à mes fins. Dès que j'en ai les moyens j'embauche un expert PHP/SQL pour mes développement; Mon métier à moi c'est de développer le SEO et le chiffre d'affaire.
Et avec mes maigres connaissances apprises sur le tas j'arrive à faire des choses pas trop mal.
 
Merci beaucoup pour toutes ces bonnes explications.


---------------
Bha ouais mais bon, m'enfin quoi...
Reply

Marsh Posté le 22-03-2011 à 11:20:16    

Perd pas de vue qu'une BD mal modélisée, mal tunée (index, variables de conf...) et des requêtes mal écrites peuvent te ruiner l'exploitation d'un outil car il ne tiendra pas la charge (et donc les gens vont partir). Et dans ce cas (quand ça rame), quand on n'y connait pas grand chose, on est tenté de dire : y'a qu'à acheter un serveur plus puissant... :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 22-03-2011 à 11:59:34    

Ecoute pour l'instant mon ptit Kimsufi 250G tiens sans problème les 10/12000 VU jour et a encaissé les pics à 20 000 sans broncher.
 
Faut dire que je met en cache les résultats tous les soirs à 1h du matin : pendant 24h les pages délivrées ne passent que par apache qui envoit une version statique HTML pure.
 
Après, si un jour ça monte vraiment, je te dis je prends un expert pour qu'il repasse toutes les requêtes, les tables et la conf SQL en revue. Mon on en est pas là ;)


---------------
Bha ouais mais bon, m'enfin quoi...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed