IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Tri par la moyenne des valeurs de champs ?


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut Tri par la moyenne des valeurs de champs ?
    Bonjour,

    Voilà mon problème. J'ai une table qui contient entre autre 4 champs avec des notes dedans et je voudrais faire un select sur ma table qui puisse être ordonné par rapport à la moyenne des valeurs de ces 4 champs POUR CHAQUE LIGNE !
    J'insiste là dessus parce que je ne veux pas sélectionner la moyenne de la colonne mais calculer la moyenne des 4 notes à la volée pour chaque ligne et trier par rapport à la moyenne.
    La requête ressemblerait donc à quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT titre, note_technique, note_rythme, note_musique, note_image FROM amv ORDER BY ...;
    C'est possible ça ?

    Merci d'avance pour vos réponses.

    rozwel
    Sébastien ARBOGAST
    SCJP

  2. #2
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2004
    Messages : 59
    Points : 59
    Points
    59
    Par défaut
    bonjour, bin je pense qu'il faut que tu les additionne et que tu fasse la moyenne donc :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT titre,AVG(note_technique+note_rythme+note_musique+note_image) as avg FROM amv ORDER BY avg .
    mais j'en suis pas sûr, mais je pense que c'est dans ce style
    Séb.

  3. #3
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Hein hein je ne pense pas, l'opérateur AVG fait la moyenne sur les colonnes justement !
    Par contre ça me fait penser à une idée...
    Est-ce que vous pensez qu'un truc comme ça ça peut marcher...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT titre,(note_technique+note_rythme+note_musique+note_image)/4 as moy FROM amv ORDER BY moy;
    ça pourrait marcher ?

    J'essaierai ça demain ! Pour l'instant dodo !
    Sébastien ARBOGAST
    SCJP

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Oui ça marcherait mais chaque requête aura à analyser toute la table pour pouvoir renvoyer le moindre résultat. Tu ferais mieux d'ajouter un champs "moyenne" qui contiendrait la moyenne de toutes les notes. Et rien de plus facile que de le renseigner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE table
    SET moyenne = (note1 + note2 + note3 + note4) / 4

  5. #5
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Citation Envoyé par Hubert Roksor
    Oui ça marcherait mais chaque requête aura à analyser toute la table pour pouvoir renvoyer le moindre résultat. Tu ferais mieux d'ajouter un champs "moyenne" qui contiendrait la moyenne de toutes les notes. Et rien de plus facile que de le renseigner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE table
    SET moyenne = (note1 + note2 + note3 + note4) / 4
    Ouais mais là c'est les performances de la table qui en souffrent parce que chaque fois que je change une note je dois remettre à jour les autres champs donc ça fait de la redondance d'informations (pâââs bien !!! )

    Donc j'ai fait comme j'ai dit : mon petit script PHP fait la requete que j'ai mis au dessus et en voiture simone j'ai mon tableau comparatif d'AMV de Noir avec mes moyennes...

    Merci à tous pour vos réponses et bon mysql
    Sébastien ARBOGAST
    SCJP

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par rozwel
    chaque fois que je change une note [...]
    err... à quelle fréquence exactement changes-tu ces notes ? Théoriquement une note ne change jamais, je ne sais pas quel type de notes tu traites mais je ne vois pas un professeur recorriger ses copies chaque semaine ou des juges changer l'ordre du dernier podium d'une compétition à l'autre : Et puis même si les notes devaient changer de temps à autre tu n'as évidemment pas à mettre à jour toute la table, une clause WHERE permet de limiter le champs d'application de la requête UPDATE.

    Citation Envoyé par rozwel
    redondance d'informations (pâââs bien !!! )
    Acceptable IMNSHO au vu du gain de performance. Il faut bien comprendre qu'à chaque SELECT classant les résultats d'après la moyenne, MySQL va devoir lire l'intégralité de la table, calculer la moyenne, créer une table temporaire, classer la table puis finalement renvoyer une partie des résultats. Dans le cas d'un champs "moyenne" indexé, MySQL ne récupèrera que les lignes qui seront renvoyées, n'aura pas à créer de table temporaire et n'aura probablement même pas à classer les résultats. Il faut pour cela avoir créé un index composite couvrant intégralement la clause WHERE et dont la dernière partie est le champs moyenne.

    Voilà, tu sais tout, bonne chance.

  7. #7
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Ca m'intéresse bien ce que tu dis... Perso je pensais qu'il se contentait de calculer la moyenne des 4 champs de la ligne sur laquelle il est en train d'opérer mais non c'est vrai que dans la logique d'SQL il doit faire ça sur les colonnes entières à chaque fois.

    Par contre, concrètement je vois pas du tout comment je peux créer un index à la volée. Philosophiquement ça me gène beaucoup moins que la redondance. Comment je pourrais faire concrètement pour me faire une table temporaire avec juste les moyenne calculées.

    Sinon pour revenir sur la redondance, c'est pas tellement que les notes sont supposées changées, c'est surtout l'aspect conceptuel de la redondance qui me chiffonne...

    Merci pour ton aide
    Sébastien ARBOGAST
    SCJP

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Concernant l'index, il s'agit d'un index normal, il n'est pas calculé "à la volée". Tu ajoutes une nouvelle colonne "moyenne" à la table et tu crées un index sur cette colonne. Tu renseignes cette colonne grâce à un script ou plus simplement avec la requête plus haut puis tu OPTIMIZE la table par principe et ça roule. Évidemment, par la suite il ne faut pas oublier de renseigner le champs "moyenne" de chaque nouvel enregistrement.

    Tu pourrais créer une table temporaire (voir le manuel à CREATE [TEMPORARY] TABLE) mais il n'y a pas vraiment d'intérêt. De toute façon c'est ce que fait MySQL par défaut: si par exemple tu exécutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT titre,(note_technique+note_rythme+note_musique+note_image)/4 as moy 
    FROM amv
    ORDER BY moy
    LIMIT 10
    MySQL créera une table temporaire ayant pour champs "titre, moy", la remplira avec l'équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO tabletemp
    SELECT titre,(note_technique+note_rythme+note_musique+note_image)/4 
    FROM amv
    puis renverra l'équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT titre, moy
    FROM tabletemp
    ORDER BY moy
    LIMIT 10
    ...tout ça parce que tu ne peux pas classer un champ qui n'existe pas. (le champs "moy" calculé dynamiquement)

    Maintenant, si ta table possède un vrai champ (redondant ) "moyenne" alors dans le pire des cas cela évite de passer par l'étape "table temporaire". Et si ce champs est indexé, bingo, tu évites même l'étape de classement car les indexes sont préclassés. (voir le manuel)

  9. #9
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Ok ben merci pour tous ces précieux conseils mais finalement je vais rester sur mon modèle tout simple et pas optimisé du tout, mais qui marche sans se casser la tête en mise à jour et en création d'index divers. De toute façon je fais pas ça pour une grosse base de données professionnelle, je fais ça pour une petite table d'une centaine d'entrée maxi pour un petit site web qui a déjà des problèmes de performances beaucoup plus importants.

    Mais j'ai noté l'idée et je la réutiliserai à l'occasion.

    Merci beaucoup...

    rozwel
    Sébastien ARBOGAST
    SCJP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/12/2010, 14h38
  2. count sur des valeurs de champs
    Par Braillane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/05/2007, 17h27
  3. JSP : recuperation des valeurs de champs d'un formulaire
    Par keumlebarbare dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 26/01/2007, 11h16
  4. Réponses: 5
    Dernier message: 17/08/2006, 15h45
  5. [Cookies] Conserver des valeurs de champs
    Par Sergejack dans le forum Langage
    Réponses: 4
    Dernier message: 31/07/2006, 12h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo