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 :

SQL COUNT et affichage tableau


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut SQL COUNT et affichage tableau
    Bonjour, bonsoir

    J'ai actuellement 3 tables dans ma base de données :

    - Etudiant {id_etudiant, prenom, age}
    - Calendrier {id_calendrier, jour, horaire, sortie}
    - Inscription {id, id_etudiant, id_calendrier}

    La table "inscription" permet bien entendu d’inscrire un étudiant à une date de sortie. Le nombre maximum d'inscrit pour chaque sortie est de 10 étudiants. J'aimerais grâce à une requête afficher le nombre de places restantes pour chaque date dans un tableau, qui reprend à chaque fois les données jour, horaire et sortie.

    Je sais bien que je dois utiliser un SELECT COUNT, mais je n'arrive même pas à simplement afficher le nombre d’étudiant inscrit par date ... Voici où je me suis arrêtée, et bien évidemment c'est complètement faux. J'ai épluché beaucoup de sujets avant de poster, mais rien n'y fait je m'en sors pas, grande débutante que je suis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $reponse= $bdd->prepare('SELECT jour, creneau COUNT(id_etudiant) AS nbr_etudiant FROM inscription, calendrier, etudiant WHERE etudiant.id_etudiant=inscription.id_etudiant AND calendrier.id_calendrier=inscription.id_calendrier AND inscription.id_calendrier = ?');
     
    $reponse->execute(array($_GET=['enfant']));
    //$donnees=$reponse->fetch()
     
    while ($donnees=$reponse->fetch())
    	{
    		echo $donnees['nbr_etudiant'];
    	}
    else 
    {
    echo "probleme";
    }
    //ec
    Sur un autre script, j'ai affiché simplement le planning des sorties, avec le code suivant. En faite, j'aimerais le même résultat mais avec l'information du nombre de places restantes en plus, dans une nouvelles colonnes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $reponse= $bdd->query('SELECT id_calendrier, jour, horaire, sortie FROM calendrier');
    echo "<TABLE border='1' cellpadding='6'>\n" ;
    echo "<TR><TD> Date </TD><TD> Horaire </TD><TD> Sortie proposée </TD><TR>";
    while ($donnees=$reponse->fetch())
    {
    	$jour=$donnees['jour'];
    	//echo "<TH>$jour</TH>" ;
    	echo "<TR><TD>{$donnees['jour']}</TD><TD>{$donnees['horaire']}</TD><TD>{$donnees['sortie']}</TD></TR>" ; 
    }
    echo "</TABLE>" ;
    $reponse->closeCursor();
    Je sais que c'est peu comme travail pour demander de l'aide, mais je n'y arrive plus du tout. Alors merci d'avance !

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    ...et bien évidemment c'est complètement faux...
    C'est quoi qui est faux ? plantage PHP ... résultat erroné etc.



    La forme de la requête n'est pas "bonne"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT jour, creneau COUNT(id_etudiant) AS nbr_etudiant FROM inscription, calendrier, etudiant WHERE ...
    ou plutôt de syntaxe très/trop ancienne !!!

    Avant d'attaquer PHP, se mettre sur la base de données et lancer des requêtes pour voir
    le résultat ... jusqu'à obtenir le résultat souhaité

    Essayer ceci déjà en remplaçant alternativement le par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     count(distinct(e.id_etudiant))
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select c.id_calendrier, c.jour, c.horaire, c.sortie, count(*)
    from Etudiant e
    inner join Inscription i 
    on e.id_etudiant = i.id_etudiant
    inner join Calendrier c
    on i.id_calendrier = c.id_calendrier
    group by c.id_calendrier, c.jour, c.horaire, c.sortie
    et ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select c.id_calendrier,count(*)
    from Etudiant e
    inner join Inscription i 
    on e.id_etudiant = i.id_etudiant
    inner join Calendrier c
    on i.id_calendrier = c.id_calendrier
    group by c.id_calendrier
    Si le résultat escompté n'est pas le bon ? fournir un jeu d'essai + résulat escompté ? pour avoir des réponses plus précises ...
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour ! Merci beaucoup pour ton aide, et vraiment desolée de la réponse tardive !

    La requête est niquel, je ne connaissais pas du tout INNER JOIN. Justement j'avais essayé dans la base de données directement, et rien n'y faisait.
    Dans ma BDD, la première requête fonctionne, et me rajoute bien une colonne pour le nombre total d'inscrit !!
    Mais ça coince au niveau de l'affichage de la réponse via php, je m'y prends surement mal. Comme il n'y a pas de paramètre, une requête préparée me semble pas nécessaire (non ?), donc :

    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
    26
    27
    28
    29
    30
    31
     
    $reponse= $bdd->query('SELECT calendrier.id_calendrier, calendrier.jour, calendrier.horaire, calendrier.sortie, count(*) 
    AS nbr_inscrit
    FROM etudiant 
    INNER JOIN inscription on etudiant.id_etudiant = inscription.id_etudiant 
    INNER JOIN calendrier on inscription.id_calendrier = calendrier.id_calendrier 
    GROUP BY calendrier.id_calendrier, calendrier.jour, calendrier.horaire, calendrier.sortie');
     
    if ($donnees=$reponse->fetch())
     
    	//while ($donnees=$reponse->fetch())
     
    	$nbr_inscrit = $donnees['nbr_insscrit'];
    	$var=0;
     
    	echo "<TABLE border='1' cellpadding='6'>\n" ;
    	echo "<TR><TD> Date </TD><TD> Creneau horaire </TD><TD> Activite proposee </TD> <TD> Nombre</TD><TR>";
    	{
    	//echo print_r($donnees);
    	echo "<TR><TD>{$donnees['jour']}</TD><TD>{$donnees['horaire']}</TD><TD>{$donnees['sortie']}</TD><TD> $nbr_inscrit </TD></TR>";
    	$var=1;
     
    	//}
     
    if ($var==0)
       {
    	   echo "Aucunes informations sur la disponibilité de cet horaire br>";
       }
    }
    echo "</TABLE>" ;
    $reponse->closeCursor();
    La première ligne de mon tableau s'affiche correctement, avec les différentes colonnes, et le nombre d'inscrit :

    - 2019-01-02 matin Visite au musee 12

    C'est déjà pas mal, mais pas la suite .. Me voila de retour face à mon plus grand soucis avec ces matières : les boucles (décidément, ça ne rentrera jamais ).
    Quand je mets WHILE au tout début, rien ne s'affiche dans le tableau, sauf un nombre d'inscrit qui semble provenir de la dernière ligne de la table (la dernière sortie enregistrée). Seul un IF en début me propose un résultat plus probant.

    En tout cas encore merci de l'aide pour la requête

  4. #4
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Pour le while, je pense qu'il faut sortir la balise <TABLE>du while déjà

    Et
    1) Virer le if pour l'instant ... comme il y a des données, pour simplifier ...
    2) Faire en sorte que tout s'affiche correctement
    3) S'occuper du cas où il n'y aurait rien à afficher (if)
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    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
     
     
    $reponse= $bdd->query('SELECT calendrier.id_calendrier, calendrier.jour, calendrier.horaire, calendrier.sortie, count(*) 
    AS nbr_inscrit
    FROM etudiant 
    INNER JOIN inscription on etudiant.id_etudiant = inscription.id_etudiant 
    INNER JOIN calendrier on inscription.id_calendrier = calendrier.id_calendrier 
    GROUP BY calendrier.id_calendrier, calendrier.jour, calendrier.horaire, calendrier.sortie');
    echo "<TABLE border='1' cellpadding='6'>\n" ;
    echo "<TR><TD> Date </TD><TD> Horaire </TD><TD> Sortie </TD> <TD> Nombre</TD><TR>";
     
     
    while ($donnees=$reponse->fetch())
    {
    	$nbr = $donnees['nbr'];
     
    	if ($donnees=$reponse->fetch()) 
    	{
    	echo "<TR><TD>{$donnees['jour']}</TD><TD>{$donnees['horaire']}</TD><TD>{$donnees['sortie']}</TD><TD> {$donnees['nbr_inscrit']} </TD></TR>";
       }
    }
     
    echo "</TABLE>" ;
    $reponse->closeCursor();
    Si je ne mets pas de IF après le WHILE, le tableau reste vide. Il doit y avoir quelque chose d'autre a mettre en valeur pour le WHILE ou le IF, mais je ne vois pas du tout quoi.
    Avec ce code, ce sont des entrées limite "aléatoire" qui s'affichent dans le tableau (mais elles sont correctes !) : la 2eme, 4eme, 12eme et 17eme. Je comprends pas pourquoi la boucle ne prends en compte que ces entrées là, alors que dans ma BDD, il y a bien des inscriptions pour les autres jours/horaires

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Il est normal que toutes les lignes ne soient pas affichées: tu as un fetch dans la condition du while (ligne 13), et un autre dans la boucle (ligne 17).
    Le deuxième est de trop.

    Tatayo.

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour, merci de ta réponse ! Effectivement, ce n’était pas logique, je finie par ne plus voir les erreurs ..

    Cependant, en supprimant ce deuxième fetch, j'ai obtenue deux erreurs :

    - Fatal error: Uncaught Error: Cannot use object of type PDOStatement as array in C:\wamp\www\sortie\consultation_test.php on line 32
    - Error: Cannot use object of type PDOStatement as array in C:\wamp\www\sortie\consultation_test.php on line 32

    La ligne 32 correspond à l'affichage des résultats de la requête dans le tableau.

    J'ai testé ça, mais rien n'y fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    echo "<TR><TD>{$donnees['jour']}</TD><TD>{$donnees['horaire']}</TD><TD>{$donnees['sortie']}</TD><TD> 'nbr </TD></TR>";
     
    echo "<TR><TD>{$donnees['calendrier.jour']}</TD><TD>{$donnees['calendrier.horaire']}</TD><TD>{$donnees['calendrier.sortie']}</TD><TD> {$donnees['nbr']} </TD></TR>";
    Je suis certaine que l'erreur provient du IF, il faut certainement lui associé autre chose, non ?

    EDIT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    echo "<TABLE border='1' cellpadding='6'>\n" ;
    echo "<TR><TD> Date </TD><TD> Horaire </TD><TD> Sortie </TD> <TD> Nombre</TD><TR>";
     
     
    while ($donnees=$reponse->fetch())
    {
    	$nbr = $donnees['nbr'];
    	echo "<TR><TD>{$donnees['jour']}</TD><TD>{$donnees['horaire']}</TD><TD>{$donnees['sortie']}</TD><TD> {$donnees['nbr']} </TD></TR>";
    }
    echo "</TABLE>" ;
    $reponse->closeCursor();
    Je ne sais pas ce que j'ai fait de plus, mais avec le code ci dessus ça m'affiche correctement dans le tableau le nombre d'inscrits en fonction de la date !
    Maintenant il me reste à trouver comment afficher le nombre de places restantes par horaire, et un moyen de différencier les horaires qui sont complets de ce qui sont encore libre (genre colorier ces cases la du tableau ou les mettre en gras) !

Discussions similaires

  1. [MySQL] count affichage tableau
    Par fasyr dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/04/2009, 16h04
  2. [SQL] Problème d'affichage de données (tableau html)
    Par Flynt dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/02/2008, 11h04
  3. [Tableaux] affichage tableau php apres requete sql count
    Par heteroclite dans le forum Langage
    Réponses: 1
    Dernier message: 13/09/2006, 20h53
  4. [MySQL] Problème affichage tableau PHP avec données SQL
    Par akalaan dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/04/2006, 14h34
  5. affichage tableau
    Par je®ome dans le forum C
    Réponses: 5
    Dernier message: 27/10/2005, 17h59

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