MySQL : AVG() dans un WHERE

MySQL : AVG() dans un WHERE - SQL/NoSQL - Programmation

Marsh Posté le 08-09-2013 à 11:42:59    

Bonjour,
 
Je voudrais faire un truc du genre :
SELECT marque,produit WHERE AVG(prix) = (($prix_min + $prix_max)/2);
$prix_min correspond au prix minimal trouvé dans tous les résultats et $prix_max le plus élevé.
 
En gros je veux faire une requête pour trouver les produits qui ont le même prix moyen (je ferai un BETWEEN mais j'ai simplifié pour l'exemple).
 
Sauriez vous comment faire svp ?
 
Merci


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

Marsh Posté le 08-09-2013 à 11:42:59   

Reply

Marsh Posté le 08-09-2013 à 13:46:23    

Le AVG est une fonction d'agrégat, donc calculé après la phase de group by
 
donc il faut mettre ta condition dans le having  
 
Mysql permet de faire d'utiliser des fonctions d'agrégat dans groupe by , ce qui est très sale
 
 

Code :
  1. SELECT marque, id_produit
  2. FROM pwet
  3. WHERE couleur="rose" /*on filtre ce qu'on veut agréger*/
  4. GROUP BY marque,id_produit /*tous les champs non agrégés doivent apparaitre ici*/
  5. HAVING AVG(prix) BETWEEN 3 AND 10 /* on filtre après agregation*/


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

Reply

Marsh Posté le 08-09-2013 à 15:48:32    

merci c'est au top.
"C'est très sal" c'est à dire ?

 

Dans ce cas pourquoi ne pas toujours utiliser having au lieu de where ?


Message édité par vanquishV12 le 08-09-2013 à 15:48:50

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

Marsh Posté le 08-09-2013 à 16:43:14    

c'est un group by implicite, donc il ya un côté magie noire faite en cachette  
 
on utilise un where pour filtrer avant le group by, having by pour le faire après. Les deux ont un usage précis.


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

Reply

Marsh Posté le 09-09-2013 à 16:16:24    

De façon un peu plus imagée, le WHERE permet de filtrer les enregistrements de la table ou des tables impliquées dans la requête, le HAVING permet de filtrer les résultats remontés par la requête dans le SELECT.


---------------
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 09-09-2013 à 18:04:15    

ok merci. L'un est plus lent que l'autre ?


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

Marsh Posté le 10-09-2013 à 09:43:54    

ben faut d'abord faire le where pour limiter ce qui est remonté dans le SELECT. Par ailleurs, ça serait ballot de faire un filtrage dans le HAVING alors que tu peux le faire dans le WHERE. Pour l'aspect perfs, j'ai jamais testé pour comparer. C'est juste une question de logique. J'aurais tendance à dire que le HAVING est la pour faire des filtrage que tu peux pas faire avec le WHERE (ou alors faisable par un WHERE, comme une opération sur une agrégation genre AVG mais au travers d'une sous-requête ce qui là, peu faire baisser les perfs)...


---------------
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

Sujets relatifs:

Leave a Replay

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