si tu utilises une fonction du type min() dans un select avec d'autres champs à sélectionner il te faut une clause goup by.j'ai essayé ça sans champ1, et bizarrement ça marche :
SELECT MIN( champ2 + champ3) as mini FROM table WHERE (champ2 + champ3) < champ4
avec champ1 ça marche pas, il faut MIN() soit seul, étonnant
Code : Tout sélectionner
SELECT un, (deux + trois) AS somme, deux, trois
FROM toto
WHERE (deux + trois) < quatre
HAVING (deux + trois) = min( deux + trois )
Code : Tout sélectionner
$requete = "SELECT id_championnat_pays , pays, ( nbr_membre_actif + nbr_membre_attente) AS somme, nbr_membre_actif, nbr_membre_attente
FROM pays_tbl
WHERE ( nbr_membre_actif + nbr_membre_attente) < nbr_club_jouable
HAVING ( nbr_membre_actif + nbr_membre_attente) = min( nbr_membre_actif + nbr_membre_attente) "; Code : Tout sélectionner
SELECT id_championnat_pays , pays, ( nbr_membre_actif + nbr_membre_attente) AS somme, nbr_membre_actif, nbr_membre_attente
FROM pays_tbl
WHERE ( nbr_membre_actif + nbr_membre_attente) < nbr_club_jouable
group by ( nbr_membre_actif + nbr_membre_attente),pays
order by ( nbr_membre_actif + nbr_membre_attente)
Code : Tout sélectionner
SELECT id_championnat_pays , pays, ( nbr_membre_actif + nbr_membre_attente) AS somme, nbr_membre_actif, nbr_membre_attente
FROM pays_tbl
WHERE ( nbr_membre_actif + nbr_membre_attente) < nbr_club_jouable
group by ( nbr_membre_actif + nbr_membre_attente)
order by ( nbr_membre_actif + nbr_membre_attente) limit 1 tu enregistres dans la boucle while chaque 'somme' dans un tableau $tab_somme()" if pour tester tous tes champs 'somme' par rapport au premier que tu as reçu. dès qu'il y a une différence tu sors de ton while avec un 'break'."
$tab_somme() = array();
$i='1';
while($row=mysql_fetch_array($result)){
$tab_somme[$i]=$row['somme'];
if($tab_somme[1] != $tab_somme[$i]){
break;
}
$i=$i+1;
}$row=mysql_fetch_array($result);
$limit=$row['somme'];
//tu traites les données de ta première ligne
//tu crées une boucle pour exploiter les résultats suivants
while($row=mysql_fetch_array($result))
{
if($row['somme']==$limit)
{
//traitement des données
}
else
{
break;
}
}
table toto:select * from toto having num=min(num)
=>la requête renvoit à nouveau 3select * from toto where num>2 having num=min(num)
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;
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.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.
mon exemple n'est ni faux, ni vrai mais est juste un exemple qui veut dire: quand je fait ça voila ce qui arrive.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.
tu me confirmes que tu n'as pas cerné le problème.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;