Erreur Requête Average

Résolu/Fermé
Esfriert Messages postés 5 Date d'inscription samedi 23 décembre 2017 Statut Membre Dernière intervention 23 décembre 2017 - 23 déc. 2017 à 17:25
 Utilisateur anonyme - 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.

4 réponses

jordane45 Messages postés 38429 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 février 2025 4 735
23 déc. 2017 à 20:37
Bonjour

Avec AVG tu dois mettre un group by Fk_titre
0
Esfriert Messages postés 5 Date d'inscription samedi 23 décembre 2017 Statut Membre Dernière intervention 23 décembre 2017
23 déc. 2017 à 22:13


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

Merci quand même!
0
jordane45 Messages postés 38429 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 février 2025 4 735
23 déc. 2017 à 22:58
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"

0
Esfriert Messages postés 5 Date d'inscription samedi 23 décembre 2017 Statut Membre Dernière intervention 23 décembre 2017
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??
0
jordane45 Messages postés 38429 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 février 2025 4 735 > Esfriert Messages postés 5 Date d'inscription samedi 23 décembre 2017 Statut Membre Dernière intervention 23 décembre 2017
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
0
Utilisateur anonyme
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.
0
Utilisateur anonyme
23 déc. 2017 à 23:04
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.
0
jordane45 Messages postés 38429 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 février 2025 4 735
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.
0
Esfriert Messages postés 5 Date d'inscription samedi 23 décembre 2017 Statut Membre Dernière intervention 23 décembre 2017
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?
0
jordane45 Messages postés 38429 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 février 2025 4 735
23 déc. 2017 à 23:21
En utilisant le type INT ou TINYINT
0
Ç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
0
Esfriert Messages postés 5 Date d'inscription samedi 23 décembre 2017 Statut Membre Dernière intervention 23 décembre 2017
23 déc. 2017 à 23:32
Merci beaucoup, ça m'a débloqué! J'aurais pas trouvé de sitôt sans votre aide :D !
0