par
thierry » 24 mai 2005, 16:43
Pour te confirmer que ce que j'ai dis est bien le standard SQL et la logique ensembliste même. et non seulement le comportement de quelque SGBDR.
je ne remet pas en cause le standart sql(là n'est vraiment pas la question), en revanche je me pose une question sur une fonctionnalitée de mysql.
Ton exemple est faux parceque tu as choisi des données classées par ordre croissant et le comprtement de MYSQL vis-à-vis de ça le prouve (aucun résultat si les données ne sont pas classées).
On peut concidérer que c'est une abération que MYSQL d'accèpter un Having sans GROUP BY parceque justement ce dernier applique un classement avant le HAVING.
mon exemple n'est ni faux, ni vrai mais est juste un exemple qui veut dire: quand je fait ça voila ce qui arrive.
d'autre part un order by permet de classer un jeu de résultat mais ne peut se trouver que après la clause having.
reste donc effectivement le group by, qui est inutile pour ce que je veut faire, c'est à dire ramener la valeur minimum d'une table(si tu me dis que j'avais qu'à faire un order by avec un limit 1, ou autre chose, on va vraiment pas être copain) et non pas toutes les valeurs du champs num.
pour ce qui est de l'aberration de mysql d'autoriser de tels choses là n'est pas non plus le problème, mysql l'autorise et c'est tout.
je veux dire par là que c'est comme si on reprochait à php d'autoriser de ne pas déclarer de variables.
php l'autorise et reste cohérent vu que les scripts fonctionnent, ce qui n'est pas le cas de mysql avec having(j'entend par là qu'il a l'air de l'autoriser seulement si...).
la question du rôle de WHERE si le HAVING prend sa place! En fait il n'en est rien même sous MYSQL le Having garde sa place derière le GROUP BY : La documentation de MYSQL le confirme d'ailleurs :
Citation:
N'utilisez pas HAVING pour des éléments qui devraient être dans la clause WHERE . Par exemple, n'écrivez pas ceci :
mysql> SELECT nom_de_colonne FROM nom_de_table HAVING nom_de_colonne > 0;
Ecrivez plutôt cela :
mysql> SELECT nom_de_colonne FROM nom_de_table WHERE nom_de_colonne > 0;
tu me confirmes que tu n'as pas cerné le problème.
je ne cherche pas à remplacer 'where' par 'having'.
je cherche à filtrer un jeux de résultats par rapport au résultat d'une fonction d'aggrégation sur un champs(donc seulement possible avec un having).
donc oui c'est sympa de ta part de répondre à ma question, mais ne répond pas en m'expliquant que d'ordinaire une voiture posséde 4 roues, ça tout le monde le sais
