Comment faire une division de deux donnée de la BDD?

Juliendu69
Invité n'ayant pas de compte PHPfrance

12 juil. 2008, 00:54

Bonjour!
Je suis débutant en php, et je me retrouve face a un problème.
Je voudrais simplement savoir comment afficher le resultat que donne la division de deux données de ma BDD.

Les visiteurs note des jeux (id) avec une note entre 1 et 5.
Ma base de donnée se présente ainsi:

id - votes - notes
1 - 8 - 24
2 - 5 - 17
3 - 9 - 29
etc...

Je veux obtenir le classement des id par "moyenne".
Je cherche donc les formules que je doit mettre aux deux endroits ou j'ai mis X0X0X0X0X0X0:

Code : Tout sélectionner

<?php mysql_connect("xxxxx", "xxxxx", "xxxxx"); mysql_select_db("xxxxx"); $reponse = mysql_query("SELECT * FROM xxxx ORDER BY X0X0X0X0X0X0 DESC LIMIT 0, 5"); while ($donnees = mysql_fetch_array($reponse) ) { echo "La moyenne du jeu numero ".$donnees['id']." est de X0X0X0X0X0X0 "; } mysql_close(); // Déconnexion de MySQL ?>
Merci par avance! Je sais qu'il doit y avoir une utilisation de / mais j'ai passé ma journée a tout essayer sans succès... :roll:

Mammouth du PHP | 881 Messages

12 juil. 2008, 04:22

Il nous faudrait la structure de ta BDD et quelques données pour comprendre et être en mesure de t'aider.

Il y aussi une première étape incontournable, celle du manuel des commandes mysql http://dev.mysql.com/doc/refman/5.0/fr/index.html

Tu trouveras là les informations nécessaires à la réalisation du calcul de moyenne sur une série d'enregistrements http://dev.mysql.com/doc/refman/5.0/fr/ ... tions.html
Soyez artisans de paix

Juliendu69
Invité n'ayant pas de compte PHPfrance

12 juil. 2008, 11:02

J'ai mis la structure de ma BDD, du moins je l'ai shématisé:

:?

id - votes - notes
1 - 8 - 24
2 - 5 - 17
3 - 9 - 29
etc...

Mammouth du PHP | 881 Messages

12 juil. 2008, 20:02

Ça ne compte pas. Donne-nous la vrai structure, celle que te retourne MySQL quand tu fais "exporter". Tant qu'à y être, que ton export compte aussi quelques enregistrements.
Soyez artisans de paix

Juliendu69
Invité n'ayant pas de compte PHPfrance

13 juil. 2008, 01:34

Voila ce qui apparait quand je fais exporter:

Code : Tout sélectionner

-- -- Structure de la table `ratings` -- CREATE TABLE IF NOT EXISTS `ratings` ( `id` varchar(50) NOT NULL, `total_votes` int(11) NOT NULL default '0', `total_value` int(11) NOT NULL default '0', `used_ips` longtext, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `ratings` -- INSERT INTO `ratings` (`id`, `total_votes`, `total_value`, `used_ips`) VALUES ('snttris', 0, 0, ''), ('pipemania', 0, 0, ''), ('zookeeper', 0, 0, ''), ('shanghaidynasty', 1, 4, 'a:1:{i:0;s:13:"xx.xx.xxx.xxx";}'), ('superkaka', 1, 3, 'a:1:{i:0;s:13:"xx.xx.xxx.xxx";}'), ('mysteriez', 0, 0, ''), ('bubbletrouble', 1, 5, 'a:1:{i:0;s:13:"xx.xx.xxx.xxx";}'), ('bubbleshooter', 0, 0, ''), ('splatman', 1, 4, 'a:1:{i:0;s:13:"xx.xx.xxx.xxx";}'), ('bistrostars', 1, 5, 'a:1:{i:0;s:13:"xx.xx.xxx.xxx";}'), ('supermarioflash', 1, 5, 'a:1:{i:0;s:13:"xx.xx.xxx.xxx";}'), ('differentpicture', 1, 5, 'a:1:{i:0;s:13:"xx.xx.xxx.xxx');
Voici l'image de ma BDD (j'ai caché les ip):

Image

Chaque fois qu'un visiteur donne une note sur 5, total_vote prend +1 et total_value prend +(sa note / 5)
Ce que je cherche a faire, c'est afficher une liste des jeux du type:

La moyenne du jeu snttris est de X
La moyenne du jeu pipemania est de X
La moyenne du jeu zookeeper est de X
La moyenne du jeu shanghaidynasty est de X


Donc je cherche la formule qui me permettrai de diviser "total_votes" par "total_value" et a l'inclure dans mon code php présenté dans mon précédent message...

J'espère vous avoir donné toutes les infos cette fois! :)

ViPHP
ViPHP | 5924 Messages

13 juil. 2008, 02:14

Soit dit en passant modéliser une liste d'ip dans un champ longtext, c'est une mauvaise modélisation. Il aurait été préférable de créer une nouvelle table avec un champ contenant l'id du jeu et un champ varchar contenant une ip… Si tu ne le fais pas tu comprendras ta douleur quand tu commenceras à avoir une quantité conséquente de votes…

Mammouth du PHP | 881 Messages

13 juil. 2008, 02:19

Donc je cherche la formule qui me permettrai de diviser "total_votes" par "total_value" et a l'inclure dans mon code php présenté dans mon précédent message...
Ah oui, là c'est beaucoup plus clair.

Il te suffit de faire une requête qui créera une colonne virtuelle qui ressemblera à ceci:

Code : Tout sélectionner

SELECT id, total_votes AS votes, total_value AS nombre, (total_votes/total_value) AS moyenne FROM `ratings`
Tu peux aussi faire faire à MySQL les calculs d'arrondissement, de multiplication:

Code : Tout sélectionner

SELECT id, total_votes AS votes, total_value AS nombre, round((total_votes/total_value)*100) AS moyenne FROM `ratings`
Ensuite, tu récupères ces valeurs comme tout autre champ de la base. Dans l'exemple ci-haut, le champ s'appellera moyenne. Donc tu aurais quelque chose comme ceci:

echo "La moyenne du jeu numero ".$donnees['id']." est de  ".$donnees['moyenne']; 
Soyez artisans de paix

Mammouth du PHP | 881 Messages

13 juil. 2008, 02:24

Aussi, je ne sais pas pour les experts, mais moi je réserve toujours le champ "id" pour un numéro séquentiel. Ça devient très utile pour faire des liens entre les tables quand tu commences à avoir des bases de données complexes. Puisque tu indiques commencer en la matière, aussi bien prendre de bonne habitudes. Dans le cas de la table présentée, j'aurais un id qui serait un nombre de 1 à xyz et le champ que tu appelles id s'appellerait "nom"

Fais comme tu veux. Le commentaire des experts sera pour moi aussi un apprentissage bien venu.
Soyez artisans de paix

ViPHP
ViPHP | 5924 Messages

13 juil. 2008, 02:26

Pour le classement sur la moyenne tu peux le faire par ORDER BY…

Mammouth du PHP | 881 Messages

13 juil. 2008, 02:36

On peut aussi limiter les résultats aux seuls jeux qui ont des évaluations:

Code : Tout sélectionner

SELECT id, total_votes AS votes, total_value AS nombre, round((total_votes/total_value)*100) AS moyenne FROM `ratings` HAVING moyenne > 0 ORDER BY moyenne DESC
Soyez artisans de paix

ViPHP
ViPHP | 5924 Messages

13 juil. 2008, 03:18

Je dirais plutôt HAVING votes>0 parce que la moyenne peut être nulle :)

Mammouth du PHP | 881 Messages

13 juil. 2008, 05:25

Très juste.
Soyez artisans de paix

Invité
Invité n'ayant pas de compte PHPfrance

13 juil. 2008, 15:17

Merci milles fois!
C'est la création d'une colonne virtuelle qu'il me fallait!
 (total_value/total_votes) AS moyenne
Vraiment le top! Merci pour vos réponses! C'était pas sorcier, mais ca m'a bien aidé!
J'aimerais finalement pour que ce topic soi complet, savoir comment arrondir avec 2 chiffres après la virgule car Patriboom tu en parles a un moment mais tu donne l'exemple de la multiplication:
Tu peux aussi faire faire à MySQL les calculs d'arrondissement, de multiplication:

Juliendu69
Invité n'ayant pas de compte PHPfrance

13 juil. 2008, 17:12

Oups autant pour moi, pour arrondir, il suffit d'ajouter round devant le chiffre a arrondir.
round(total_value/total_votes) AS moyenne
Merci encore milles fois à tous!

Bon surf à tous...

Mammouth du PHP | 881 Messages

13 juil. 2008, 19:42

Il suffit d'ajouter le nombre de décimales souhaité après une virgule comme ceci: round(valeur, nb_décimales)

Ce qui donne:

Code : Tout sélectionner

SELECT id, total_votes AS votes, total_value AS nombre, round( ( total_votes / total_value ), 2 ) AS moyenne FROM `ratings` HAVING moyenne >0 ORDER BY moyenne DESC LIMIT 0 , 30
Soyez artisans de paix