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

PHP & Base de données Discussion :

Classer les résultats d'une requête mysql [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Femme Profil pro
    Presque retraitée
    Inscrit en
    Septembre 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Presque retraitée
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut Classer les résultats d'une requête mysql
    Bonjour,

    Je voudrais pouvoir afficher automatiquement sur une page php les résultats d'un concours de nouvelles que ma commune organise.

    Voici les données :

    - 3 catégories de nouvelles : "enfant", "adolescent" et "adulte"
    - 2 jurys de chacun 7 personnes sont chargés de noter les nouvelles qui arriveront, l'un des jurys prenant en charge la notation des catégories "adolescent" et "adulte" et l'autre, la catégorie "enfant". Chaque juré notera toutes les nouvelles de la (ou des) catégorie à laquelle (ou auxquelles) il est affecté. Pour nous faciliter le travail, nous avons donné un numéro à chaque juré.
    - pour que l'anonymat des participants au concours soit effectif, nous allons numéroter les nouvelles au fur et à mesure de leur réception.

    J'ai fait un formulaire pour que chaque juré entre ses notes qui iront s'inscrire dans une table mysql "notation" dans laquelle j'ai créé les champs nécessaires :

    num : le n° de juré
    nouvelle : le n° de la nouvelle
    classe : la catégorie de la nouvelle ("enfant", "adolescent", "adulte")
    note : la note attribuée

    Pour l'affichage des résultats, j'ai fait sans problème la requête permettant d'obtenir le total des votes de chaque nouvelle, classée dans l'ordre de leur numéro, puis celle indiquant le nombre de votant par nouvelle et enfin celle donnant la moyenne des notes par nouvelles ; par exemple pour la catégorie adultes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    /*sélection des nouvelles de la catégorie adulte classées par numéro*/
    $rech = mysql_query ("SELECT * FROM notation WHERE classe = 'adulte' GROUP BY nouvelle ORDER BY nouvelle");
    while ($data = mysql_fetch_array ($rech) )
    { 
    	$numnouv = $data['nouvelle'];
     
    /*total des notes par nouvelles*/
    	$req=("SELECT SUM(note) FROM notation WHERE nouvelle = '$numnouv' ");
    	$sommenouv = mysql_query ($req);
    	$totalnouv = mysql_result($sommenouv, 0);
     
    /*calcul du nombre de votes par nouvelle*/	
    	$rep = mysql_query("SELECT COUNT(note) AS nbre_jures FROM notation WHERE nouvelle = '$numnouv' ");
    	$donnees = mysql_fetch_array ($rep);
     
    	$jures = $donnees['nbre_jures'];
     
    /*pour obtenir la moyenne (avec des décimales) par nouvelle*/
    $moyenne = ($totalnouv/$jures);
    $moyenne = sprintf('%0.2f', $moyenne);
     
    /*et j'affiche le tout sur la page*/
    echo ......
    }
    Jusque là pas de problème.

    Maintenant, je voudrais afficher aussi le classement des nouvelles de cette façon :

    1 - nouvelle n° avec une moyenne de ...
    2 - nouvelle n° avec une moyenne de ...

    Bien sûr en allant de la meilleure moyenne à la plus mauvaise, et que la numérotation du classement se fasse automatiquement puisque tant que le concours n'est pas fini, nous ne connaissons pas le nombre de nouvelles que nous recevrons.

    et là, je sèche...

    Par avance merci de votre aide, et toutes mes excuses d'avoir été si longue, mais je voulais que vous ayez toutes les données.


    Patricia

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 316
    Points : 366
    Points
    366
    Par défaut
    bonsoir,
    puisque vous avez calculé les moyennes, inscrivez les dans un tableau et ensuite triez le tableau.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    A vue de pied, que donnerait une requête de ce type ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT AVG( note ) AS moyenne FROM notation GROUP BY nouvelle ORDER BY categorie ASC, moyenne DESC

  4. #4
    Membre du Club
    Femme Profil pro
    Presque retraitée
    Inscrit en
    Septembre 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Presque retraitée
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    Citation Envoyé par notar Voir le message
    puisque vous avez calculé les moyennes, inscrivez les dans un tableau et ensuite triez le tableau.
    C'est ce que j'aurais fait si les totaux des notes (et donc les moyennes), n'étaient pas évolutives. En effet, les 7 jurés de chaque jury ne notent pas tous en même temps, dont les totaux changent au fur et à mesure qu'un juré entre sa note.

    Citation Envoyé par Petibidon Voir le message
    A vue de pied, que donnerait une requête de ce type ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT AVG( note ) AS moyenne FROM notation GROUP BY nouvelle ORDER BY categorie ASC, moyenne DESC
    Essai fait, mais ne donne rien.

    N'est-il pas possible de faire ce classement "descendant" non pas au moment de la requête mysql, mais après avec du php ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 316
    Points : 366
    Points
    366
    Par défaut
    bonjour,
    puisqu'à chaque nouvelle note vous calculez la moyenne alors vous pouvez recréer votre tableau et le trier à nouveau.

  6. #6
    Membre du Club
    Femme Profil pro
    Presque retraitée
    Inscrit en
    Septembre 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Presque retraitée
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    Je sais que je suis loin d'être une experte en php/mysql, mais, si je suis le conseil de votre premier post, c'est-à-dire rentrer mes moyennes dans un tableau, plusieurs questions me viennent à l'esprit, mais, avant de les poser, je vous remets mes requêtes (cela évitera des aller-retour entre les posts)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    /*sélection des nouvelles de la catégorie adulte classées par numéro*/
    $rech = mysql_query ("SELECT * FROM notation WHERE classe = 'adulte' GROUP BY nouvelle ORDER BY nouvelle");
    while ($data = mysql_fetch_array ($rech) )
    { 
    	$numnouv = $data['nouvelle'];
     
    /*total des notes par nouvelles*/
    	$req=("SELECT SUM(note) FROM notation WHERE nouvelle = '$numnouv' ");
    	$sommenouv = mysql_query ($req);
    	$totalnouv = mysql_result($sommenouv, 0);
     
    /*calcul du nombre de votes par nouvelle*/	
    	$rep = mysql_query("SELECT COUNT(note) AS nbre_jures FROM notation WHERE nouvelle = '$numnouv' ");
    	$donnees = mysql_fetch_array ($rep);
     
    	$jures = $donnees['nbre_jures'];
     
    /*pour obtenir la moyenne (avec des décimales) par nouvelle*/
    $moyenne = ($totalnouv/$jures);
    $moyenne = sprintf('%0.2f', $moyenne);
     
    /*et j'affiche le tout sur la page*/
    echo ......
    }
    Mes questions :
    1) rentrer les moyennes (associées au n° de chaque nouvelle), veut dire, sauf erreur de ma part, faire un INSERT INTO...
    J'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* $numnouv étant, je le rappelle, le n° de la nouvelle et moyenne_adulte le nom de la table que j'ai créée pour entrer ces moyennes*/
    $sql= "INSERT INTO moyenne_adulte VALUES ('$numnouv'', '$moyenne')";
    et je me retrouve avec une erreur : "Erreur SQL !INSERT INTO moyenne_adulte VALUES ('001'', '14.68')
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '14.68')' at line 1

    2) faire une insertion de ces moyennes à partir de la page de résultats ne veut-il pas dire qu'à chaque fois qu'un visiteur ou un juré ira consulter les résultats, automatiquement un "jeu" de moyennes ira s'inscrire dans la table ? ce qui risque de gonfler énormément cette dernière avec des doublons (et je ne sais pas comment faire la requête pour les éviter) ?

    Mais je n'ai peut-être pas la bonne démarche pour entrer ces moyennes... malheureusement, c'est la seule que je connaisse au niveau qui est le mien.
    Donc, si vous vouliez bien agrémenter votre réponse d'un peu de code, j'apprécierais vraiment.
    Par avance, merci.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 316
    Points : 366
    Points
    366
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // déclarer un tableau
    $TableauDesMoyennes=array();
    // quand on a la moyenne des notes pour une nouvelle
    $TableauDesMoyennes[$numnouv] = $moyenne;
    // à la fin, trier le tableau
    $TableauDesMoyennes = asort($TableauDesMoyennes);

  8. #8
    Membre du Club
    Femme Profil pro
    Presque retraitée
    Inscrit en
    Septembre 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Presque retraitée
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut
    Bonsoir,

    Mille excuses, j'avais lu trop rapidement votre premier post et ai lu "table" au lieu de tableau, d'où ma réponse.

    J'avais déjà essayé de mettre mes données dans un tableau, pas tout à fait conçu comme ce que vous proposez, mais le résultat était le même que celui de votre solution :
    1
    1
    1
    1
    1
    etc. Autant de 1 que j'ai de nouvelles d'enregistrées.

    Or, ce que je voudrais, c'est avoir les moyennes des nouvelles en ordre décroissant.
    Il doit tout de même bien exister une solution... cela fait deux jours que je cherche, peut-être aurais-je une illumination ou la solution miracle d'un membre de ce forum, durant ce week end.

  9. #9
    Membre du Club
    Femme Profil pro
    Presque retraitée
    Inscrit en
    Septembre 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Presque retraitée
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut
    J'AI TROUVÉ...

    Il m'a suffi de modifier la première de mes requêtes. Plutôt que de commencer par sélectionner les nouvelles de la catégorie adulte classées par numéro, puis faire une deuxième requête pour calculer le total des différentes notes attribuées à chaque nouvelle, je n'ai fait qu'une seule requête.

    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $rech = mysql_query ("SELECT * FROM notation WHERE classe = 'adulte' GROUP BY nouvelle ORDER BY nouvelle");
    while ($data = mysql_fetch_array ($rech) )
    { 
    	$numnouv = $data['nouvelle'];
     
    /*total des notes par nouvelles*/
    	$req=("SELECT SUM(note) FROM notation WHERE nouvelle = '$numnouv' ");
    	$sommenouv = mysql_query ($req);
    	$totalnouv = mysql_result($sommenouv, 0);
    J'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $rech = mysql_query ("SELECT nouvelle, classe, note, SUM(note) AS total FROM notation WHERE classe = 'adulte' GROUP BY nouvelle ORDER BY total DESC");
    while ($data = mysql_fetch_array ($rech) )
    { 
    	$numnouv = $data['nouvelle'];
    	$total = $data['total'];
    J'obtiens donc le total des notes de chaque nouvelle, en ORDRE DECROISSANT. Il ne me reste plus qu'à calculer la moyenne comme je l'avais fait précédemment : compte du nombre de votes des jurés par nouvelle, puis division de la note totale de chaque nouvelle par le nombre de votes effectués.
    Et comme les totaux des notes obtenus par ma première requête est en ordre décroissant, le calcul des moyennes se fait dans le même ordre.

    Et, ainsi, pas besoin de tableau, ni de tri à faire.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 316
    Points : 366
    Points
    366
    Par défaut
    oui, à condition qu'il y ai le même nombre de jurés pour chaque nouvelle

  11. #11
    Membre du Club
    Femme Profil pro
    Presque retraitée
    Inscrit en
    Septembre 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Presque retraitée
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut
    Ce sera le cas.
    Ce ne sont pas des visiteurs du site qui vont voter, mais un jury désigné par les organisateurs du concours de nouvelles.
    Comme j'ai précisé dans mon premier post : 2 jurys de chacun 7 personnes (l'un des jurys note les catégories "adolescent" et "adulte" et l'autre, la catégorie "enfant").

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

Discussions similaires

  1. Classer les résultats d'une requête SQL
    Par xess91 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/05/2010, 10h20
  2. Réponses: 5
    Dernier message: 15/10/2008, 09h08
  3. Transformer les résultats d'une requête dans un autre ordre
    Par keikun dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 12/04/2006, 16h29
  4. Limiter les résultats d'une requête à \today\' - n jours
    Par Eddy Duflos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/10/2005, 08h46
  5. [JDBC] Stocker les résultats d'une requête
    Par etiennegaloup dans le forum JDBC
    Réponses: 9
    Dernier message: 26/07/2005, 18h18

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