Page 1 sur 1

Faire la moyenne des champs d'une base de données mysql

Posté : 29 juin 2007, 23:08
par chrislabricole
Bonjour,

je voudrait faire la moyenne des note des visiteur..., je m'explique
dans mysql, il y a champ "note" (sur 20) et je ne c'est pas comment faire pour dire à php :
selectionne toutes les données du champs "note" et tu les additionne toutes....
je ne sais pas quel fontion utilisé, je ne sais pas comment faire, après, pour diviser par le nombre d'entrés, je sais faire...
voilà, j'espère être clair...

Merci de vos réponses :)

PS: j'ai fais sa mais j'arrive pas à aller plus loin.... :
$req = mysql_query('SELECT note FROM comment');         
$count = mysql_fetch_array($req);

Posté : 29 juin 2007, 23:25
par orgerix
Tu fait une requete qui demande toutes les notes, tu compte le nombre de résultat (mysql_num_rows()), et à chaque extraction(mysql_fetch_assoc()), tu ajoute la note à une variable initalisé à 0. ENsuite tu divise tout par le nombre d'enregistrement.


Ca donne quelque chose comme ca
$result=mysql_query("SELECT note FROM comment");
$num=mysql_num_rows($result);
$total=0;
while($note=musql_fetch_assoc); {
 $total+=$note['note'];
}
if($num!=0) {
 $moy=$total/$num
}

Posté : 29 juin 2007, 23:28
par chrislabricole
Tu fait une requete qui demande toutes les notes
ben, sa, j'arrive pas à le faire,
c'est récupérer toute les notes et les additionées que j'arrive pas à faire...

Posté : 29 juin 2007, 23:29
par orgerix
Message édité avec une réponse plus complete ;)

Posté : 29 juin 2007, 23:34
par chrislabricole
Je ne compremd pas pourquoi tu fait un if et un += ???

moi, j'ai fais sa avant ta réponce plus complête mais c'est pas encore très au point...
$req = mysql_query('SELECT note FROM comment');         
$count = mysql_fetch_array($req);

$total_des_notes = 0;

while($donnees = mysql_fetch_assoc($req))
{
$phase1 = $total_des_notes + $donnees['note'];
}

$total_des_notes / $count;
eu ! sa marche pas !
à cette ligne :
$total_des_notes / $count;

Fatal error: Unsupported operand types in /mnt/145/sdb/c/d/***********/moyenne.php on line 27

Posté : 29 juin 2007, 23:39
par orgerix
POurquoi le += : $var1+=$var2 est équivalent à $var1 = $var1 + $var2.

Donc a chaque extraction, la valeur total augmentera de la valeur extraite de la BDD.

Ensuite le if, c'est tout simplement pour éviter les erreurs de divisions par zéro.

Tel que ton script est écrit, $total_des_notes vaut toujours 0 car jamais redéfini.

Posté : 29 juin 2007, 23:52
par chrislabricole
a ! voila sa marche le problème maintenent, c'est qu'il me dit que la moyenne est de :
11.3333333333

quel est la fonction pour arrondir au dixièmes ? je connait round() mais elle arrondi pas au dixième... elle arrondi au chiffre "pile" (11) peut-être que round peut prendre un atribu ??

EDIT : oui, j'ai trouver grace à la doc, round($moy = $total / $num, 2)

voici le code fini pour les intéréssés :
$result = mysql_query("SELECT note FROM comment");
$num = mysql_num_rows($result);
$total= 0 ;
while($note = mysql_fetch_assoc($result))
{
$total += $note['note'];
}

if($num != 0) 
{
echo round($moy = $total / $num, 2);
} 
Merci !

Posté : 30 juin 2007, 08:43
par Cyrano
Si tu n'as besoin que de la moyenne, tu pourrais faire ça directement en SQL dans ta requête avec un agregat : AVG() (en anglais, "average" = "moyenne". Et comme tu utilises MySQL, il y a même une autre fonction qui pourrait te permettre de n'avoir que deux chiffres après la virgule : ROUND(col, precision) : ça donnerait la requête suivante :

Code : Tout sélectionner

SELECT ROUND(AVG(note), 2) as moyenne FROM comment
ça va te retourner une donnée unique au lieu d'un paquet de lignes à traiter.

Exemple : avec une table, voici une colonne "note":

Code : Tout sélectionner

mysql> SELECT note FROM notes; +------+ | note | +------+ | 1 | | 9 | | 8 | | 0 | | 19 | | 5 | | 12 | | 17 | | 6 | | 13 | | 2 | | 5 | | 17 | | 18 | | 4 | | 6 | | 9 | | 10 | | 17 | | 18 | | 0 | | 17 | | 2 | | 19 | | 16 | | 9 | | 11 | | 14 | | 20 | | 4 | | 9 | | 3 | | 10 | | 15 | | 7 | | 15 | | 17 | | 13 | | 11 | | 7 | | 10 | | 19 | | 0 | | 10 | | 17 | | 18 | | 12 | +------+ 47 rows in set (0.00 sec) mysql> SELECT ROUND(AVG(note), 2) as moyenne FROM notes; +---------+ | moyenne | +---------+ | 10.66 | +---------+ 1 row in set (0.02 sec)

Posté : 30 juin 2007, 13:45
par chrislabricole
à ouai ok, c'est fais plus clean ! :D
eumm..
il y a pas une page sur PHPFrance avec TOUTES les requètes possibles sur mysql ??

PS :(HS)
Et au passage que je parle de tuto je les ai revisité, sa, c'est gratuit ?
http://www.phpfrance.com/tutoriaux/inde ... tp-farheen

Posté : 30 juin 2007, 14:09
par Sékiltoyai

Posté : 30 juin 2007, 14:20
par chrislabricole
à ok merci ! :D