Menu

Erreur Requête Average [Résolu]

Esfriert 5 Messages postés samedi 23 décembre 2017Date d'inscription 23 décembre 2017 Dernière intervention - 23 déc. 2017 à 17:25 - Dernière réponse : le père. 6071 Messages postés mardi 15 mai 2012Date d'inscription 12 juin 2018 Dernière intervention
- 23 déc. 2017 à 23:38
Bonjour,

Novice en Bases de données, j'ai créé une base permettant de gérer des Usagers regardant des Series. Ils ont la possibilité de de donner une note (unique) à chaque série, entre 0 et 5.

Ma requête consistait simplement à calculer la moyenne donnée pour chaque série, or la fonction AVG me renvoie des réponses qui sont impossibles.

En voilà un exemple.
La moyenne de la Série est de 4,75.

On voit ici que la réponse est fausse, elle est également impossible puisque la moyenne ne peut être supérieure à 5...

Je n'ai aucune idée de l'origine du problème. J'ai tenté de changer le type de la colonne 'Valeur' en INT ( il est actuellement en ENUM '0','1','2','3','4','5'), mais cela n'a rien résolu...

Merci d'avance pour votre aide.
Afficher la suite 

Votre réponse

12 réponses

jordane45 21395 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 15 juin 2018 Dernière intervention - 23 déc. 2017 à 20:37
0
Merci
Bonjour

Avec AVG tu dois mettre un group by Fk_titre
Commenter la réponse de jordane45
Esfriert 5 Messages postés samedi 23 décembre 2017Date d'inscription 23 décembre 2017 Dernière intervention - 23 déc. 2017 à 22:13
0
Merci


Malheureusement, ça ne change rien... :/

Merci quand même!
Commenter la réponse de Esfriert
jordane45 21395 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 15 juin 2018 Dernière intervention - 23 déc. 2017 à 22:58
0
Merci
Je t' assure que le AVG fonctionne parfaitement ... même avec un ENUM et même sans group by (je n'avais pas vu ton WHERE)

Exemple :
DROP TABLE IF EXISTS `aaa`;
CREATE TABLE IF NOT EXISTS `aaa` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `titre` varchar(50) DEFAULT NULL,
  `valeur` enum('1','2','3','4','5') DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `titre` (`titre`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

INSERT INTO `aaa` (`id`, `titre`, `valeur`) VALUES
	(1, 'A', '1'),
	(2, 'A', '1'),
	(3, 'B', '2'),
	(4, 'B', '2'),
	(5, 'C', '5'),
	(6, 'C', '5'),
	(7, 'C', '5'),
	(8, 'C', '4');

SELECT titre, avg(valeur) as MOY
FROM aaa
WHERE aaa.titre = "C"



Donc.. tu as certainement d'autres lignes dans ta table qui correspondent à ton where...

As tu essayé de faire un truc du genre pour voir ce que ça t'affiche ?
SELECT titre, SUM(valeur) as SOMME , COUNT(valeur) as NB
FROM aaa
WHERE aaa.titre = "C"

Esfriert 5 Messages postés samedi 23 décembre 2017Date d'inscription 23 décembre 2017 Dernière intervention - 23 déc. 2017 à 23:15
`Notation`
--

CREATE TABLE IF NOT EXISTS `Notation` (
  `Fk_ID_usager` int(11) NOT NULL,
  `Fk_titre` varchar(100) CHARACTER SET utf8 NOT NULL,
  `Valeur` enum('0','1','2','3','4','5') CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`Fk_ID_usager`,`Fk_titre`),
  KEY `Fk_ID_usager` (`Fk_ID_usager`),
  KEY `Fk_titre` (`Fk_titre`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `Notation`
--

INSERT INTO `Notation` (`Fk_ID_usager`, `Fk_titre`, `Valeur`) VALUES
(1, 'Helix', '1'),
(1, 'Jessica Jones', '4'),
(1, 'Orphan Black', '3'),
(2, 'Helix', '4'),
(2, 'Izombie', '5'),
(2, 'Jessica Jones', '4'),
(2, 'Once Upon A Time', '5'),
(2, 'Orphan Black', '5'),
(3, 'Orphan Black', '4'),
(4, 'Izombie', '5'),
(5, 'Jessica Jones', '2'),
(6, 'Helix', '3'),
(6, 'Orphan Black', '4'),
(7, 'Once Upon A Time', '4'),
(8, 'Orphan Black', '3'),
(9, 'Izombie', '5'),
(10, 'Izombie', '3'),
(10, 'Once Upon A Time', '5'),
(11, 'Helix', '4'),
(12, 'Helix', '4'),
(12, 'Once Upon A Time', '5'),
(13, 'Jessica Jones', '5'),
(14, 'Izombie', '2'),
(15, 'Jessica Jones', '1'),
(16, 'Orphan Black', '1'),
(17, 'Jessica Jones', '5');


Voilà toutes les valeurs de ma table 'Notation'. J'ai remarqué que lorsque je demande la moyenne, celle-ci n'est pas complètement fausse à proprement parler, mais il rajoute toujours 1 au calcul. Ainsi, les moyennes pour chaque séries passent de 4,75 à 5,75; de 3,2 à 4,2; etc.

Concernant la requête que tu m'as conseillé de faire, le résultat est intriguant. Il reconnait bien compter quatre valeurs, mais le total n'est pas bon.. Il trouve 23 au lieu de 19, ce qui fait que ma moyenne se décale et passe à 5,75..Mais d'où ça peut bien venir??
jordane45 21395 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 15 juin 2018 Dernière intervention > Esfriert 5 Messages postés samedi 23 décembre 2017Date d'inscription 23 décembre 2017 Dernière intervention - 23 déc. 2017 à 23:18
Le père t'a donné la solution...
Ton énum n'est pas bon.... il ne peut pas commencer à 0
le père. 6071 Messages postés mardi 15 mai 2012Date d'inscription 12 juin 2018 Dernière intervention - 23 déc. 2017 à 23:38
L'enum n'est pas mauvais en soi. Ce qui ne va pas, c'est d'utiliser une fonction mathématique (AVG) sur un type qui n'est pas numérique, car la conversion opérée par mysql n'est pas conforme aux préjugés qu'on a sur le sujet.
Commenter la réponse de jordane45
le père. 6071 Messages postés mardi 15 mai 2012Date d'inscription 12 juin 2018 Dernière intervention - 23 déc. 2017 à 23:04
0
Merci
Bonsoir

Attention à l'utilisation d'ENUM comme un nombre.
Comme le dit la doc de mysql, les valeurs numériques attribuées aux valeurs d'un ENUM commencent à 1, et non pas à 0
Quand Jordane (que je salue au passage ) définit enum('1','2','3','4','5'), les valeurs numériques correspondantes sont alors (1,2,3,4,5), on a l'impression que tout va bien
Quand Esfriert définit enum('0','1','2','3','4','5'), les valeurs numériques correspondantes sont alors (1,2,3,4,5,6) et la traduction de l'ENUM en nombre donne 1 de plus.
jordane45 21395 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 15 juin 2018 Dernière intervention - 23 déc. 2017 à 23:08
Bien vu.. je n'avais pas fait attention qu'il commençait à "0" ...
Donc.. en effet... la valeur ne peut pas être la bonne.
Esfriert 5 Messages postés samedi 23 décembre 2017Date d'inscription 23 décembre 2017 Dernière intervention - 23 déc. 2017 à 23:20
Compris! Il y aurait une solution pour faire en sorte de tout de même pouvoir utiliser 0, en changeant de type par exemple?
jordane45 21395 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 15 juin 2018 Dernière intervention - 23 déc. 2017 à 23:21
En utilisant le type INT ou TINYINT
le père. 6071 Messages postés mardi 15 mai 2012Date d'inscription 12 juin 2018 Dernière intervention - 23 déc. 2017 à 23:25
Ça va marcher si tu utilises le type INT ou TINYINT.
Si tu le fais avec phpmyadmin sur une base déjà existante, tu remarqueras que toutes tes valeurs vont augmenter de 1 quand tu remplaceras le type ENUM par un type INT.
Il suffira de faire
UPDATE Notation SET Valeur=Valeur-1
pour remettre les bonnes valeurs
Esfriert 5 Messages postés samedi 23 décembre 2017Date d'inscription 23 décembre 2017 Dernière intervention - 23 déc. 2017 à 23:32
Merci beaucoup, ça m'a débloqué! J'aurais pas trouvé de sitôt sans votre aide :D !
Commenter la réponse de le père.