Erreur Requête Average

Résolu
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

  1. Modérateur
    Bonjour

    Avec AVG tu dois mettre un group by Fk_titre
    0


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

      Merci quand même!
      0
      1. Modérateur
        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
        1. `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
        2. Modérateur
          @EsfriertLe père t'a donné la solution...
          Ton énum n'est pas bon.... il ne peut pas commencer à 0
          0
        3. 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
      2. 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
        1. Modérateur
          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
        2. 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
        3. Modérateur
          En utilisant le type INT ou TINYINT
          0
        4. Ç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
        5. Merci beaucoup, ça m'a débloqué! J'aurais pas trouvé de sitôt sans votre aide :D !
          0