Mysql et Count

Bonjour à tous !

Ma table
tb_reponse
enregistre chaque jour des valeurs différentes. Le champ Winner est renseigné à la fin de la journée afin qu'une seule valeur du jour soit prise en compte.
Les jours sont comptés par date("z") et le tableau ci-dessous n'affiche que les Winner(1) du jour.

Donc j'ai ceci dans mon exemple :

Jour | Participants | Pseudo 
=======================================
288 | 93 | François
287 | 93 | Éric
286 | 93 | Jean
285 | 93 | Causette
284 | 93 | Lucie


Mon problème est que je n'arrives pas à grouper et compter le nombre de participants par jour... voilà pourquoi j'ai des
93
au lieu de :

Jour | Participants | Pseudo 
=======================================
288 | 52 | François
287 | 33 | Éric
286 | 41 | Jean
285 | 69 | Causette
284 | 93 | Lucie


Et voici mon code :
<?php $Stat = $pdo->query("SELECT * FROM tb_reponse WHERE Winner='1' ORDER BY Date DESC"); while($data = $Stat->fetch(PDO::FETCH_ASSOC)){

$Nbr_Part = $pdo->query("SELECT COUNT(*) FROM tb_reponse GROUP BY Jour")->fetchColumn();
?>
<tr>
<td align="center" valign="middle"><?php echo ucwords($data['Jour']); ?></td>
<td align="center" valign="middle"><?php echo $Nbr_Part; ?></td>
<td align="left" valign="middle"><?php echo ucwords($data['Pseudo']); ?></td>
</tr>
<?php ;} ?>


Pouvez-vous m'aider à compter le nombre de participants par jour ?
Merci de votre aide !

5 réponses

  1. essaye ceci :
    $Stat = $pdo->query("SELECT Jour,COUNT(pseudo) AS participant FROM tb_reponse  WHERE Winner='1' GROUP BY Jour")or die(print_r($pdo->errorInfo()));
    while($data = $Stat->Fetch(PDO::FETCH_ASSOC))
    {
    		var_dump($data);
    }
    

    1. Merci mandolorien,

      Ton code affiche le nombre 1 au lieu du nombre de participants du jour :
      Jour | Participants | Pseudo 
      =======================================
      288 | 1 | François
      287 | 1 | Éric
      286 | 1 | Jean
      285 | 1 | Causette
      284 | 1 | Lucie


      Au lieu de :
      Jour | Participants | Pseudo 
      =======================================
      288 | 52 | François
      287 | 33 | Éric
      286 | 41 | Jean
      285 | 69 | Causette
      284 | 93 | Lucie


      Pour être plus explicite, 93 personnes ont participés aujourd'hui dont 1 seul sera sélectionné.
      Dans mon tableau récapitulatif, j'ai donc la date, le nombre de participants et qui a été sélectionné.

      Or je n'arrives pas à compter le nombre de participants par jour tout en affichant les personnes sélectionnés par jour...
  2. dans se cas enleve le :
    WHERE winner='1'

    et dans la boucle ajoute une condition :
    if(data['winner'] == '1') { /* tu affiche le vainqueur */}


    Admire la personne qui te critique , car prisonniere de ca propre jalousie elle ne fais que t admirer
    1. Non je crois que tu ne m'as toujours pas compris !

      C'est le nombre de participants par jour que je dois afficher et non pas le winner.

      52 personnes ont participés aujourd'hui et l'un d'entre eu est le Winner.
      Donc mon tableau affichera :

      Pour le jour d'aujourd'hui (288), le nombre de participants (52), et le winner qui est François :

      Jour | Participants | Pseudo 
      =======================================
      288 | 52 | François
      287 | 33 | Éric
      286 | 41 | Jean
      285 | 69 | Causette
      284 | 93 | Lucie
    2. @Sinistrusvoici ce que j'ai effectué :
      <?php
      
      $pdo = new PDO('mysql:host=localhost;dbname=test','root','');
      
      try{
      	$Stat = $pdo->query("SELECT Jour,COUNT(pseudo) AS participant,pseudo FROM tb_reponse WHERE pseudo IN (SELECT pseudo FROM tb_reponse WHERE winner ='1') GROUP BY Jour");
      }catch(PDOException $e){
          die('Erreur : ' . $e->getMessage());
      }
      
      while($data = $Stat->fetchObject()){
        var_dump($data);
      }
      ?>
      


      et voici le résultat :


      object(stdClass)[3]
      public 'Jour' => string '280' (length=3)
      public 'participant' => string '3' (length=1)
      public 'pseudo' => string 'eric' (length=1)

      object(stdClass)[4]
      public 'Jour' => string '283' (length=3)
      public 'participant' => string '1' (length=1)
      public 'pseudo' => string 'francois' (length=1)

      object(stdClass)[3]
      public 'Jour' => string '284' (length=3)
      public 'participant' => string '1' (length=1)
      public 'pseudo' => string 'd' (length=1)

      object(stdClass)[4]
      public 'Jour' => string '285' (length=3)
      public 'participant' => string '1' (length=1)
      public 'pseudo' => string 'e' (length=1)



      je te préscise que j'ai du me faire un jeu d'essai rapide ;)
    3. Modérateur
      Bonjour,

      Au passage ( ça n'a pas de rapport direct avec la question .. mais... )
      En PDO .. on n'utilise pas les OR DIE.... on passe par les exceptions.
      Donc, pour coder proprement en PDO ... merci d'appliquer ceci :
      https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

      Ensuite...
      J'ai l'impression que la question concerne d'avantage un souci de requête SQL qu'un "problème" de code PHP.
      Il aurait donc été judicieux de poser la question dans le forum BASES DE DONNEES.
    4. @jordane45désolé , j'ai corrigé l'erreur .

      cordialement
    5. Merci jordan, merci mandolorien.

      La gestion des erreurs est faite dans mon config.php
      quand au soucis de la requête SQL c'est en effet la requête désolé !
  3. Je te remercie pour ton code et pour le temps que tu m'accordes...
    J'ai n'ai toujours pas le résultat adéquat.

    Chez moi il me renvois des données erronées.
    Voici ma table : https://ufile.io/wncmy

    Avec ce code, j'ai un résultat sans groupement des pseudo :
    $Stat = $pdo->query("SELECT * FROM tb_jeu_zoom_reponse WHERE Winner='1' ORDER BY Date DESC"); while($data = $Stat->fetch(PDO::FETCH_ASSOC)){ 
    $Stat = $pdo->query("SELECT Jour, Date, Nom, Pseudo, Reponse, COUNT(Jour) AS Participant FROM tb_jeu_zoom_reponse GROUP BY Jour "); while($data = $Stat->fetch(PDO::FETCH_ASSOC)){


    Il affiche exactement ce que je veux sans pour autant grouper les pseudo par jour.

    Exemple :
    François à participé 7 fois aujourd'hui. Mais il n'est compté qu'une fois.
    Donc je dois avoir au lieu de 93 participants, plutot 86.
    1. J'ai réussi !

      <?php 
      $Stat = $pdo->query("SELECT * FROM tb_reponse WHERE Winner='1' ORDER BY Jour DESC"); while($data = $Stat->fetch(PDO::FETCH_ASSOC)){ 
      $Stat = $pdo->query("SELECT Jour, Date, Nom, Pseudo, Reponse, COUNT(DISTINCT Pseudo) AS Participant FROM tb_reponse GROUP BY Jour "); while($data = $Stat->fetch(PDO::FETCH_ASSOC)){ 
      ?>


      Seulement si quelqu'un peut m'aider à compiler le tout en une seule requête :p
      1. Contributeur
        bonsoir, suggestion:
        SELECT w.Jour, Gagnant, Participants from
        (SELECT Jour, max(Pseudo) as Gagnant FROM tb_reponse WHERE Winner='1' GROUP BY Jour) as w,
        (SELECT Jour, COUNT(DISTINCT Pseudo) AS Participants FROM tb_reponse GROUP BY Jour) as p 
        WHERE w.Jour=p.Jour
        ORDER BY w.Jour DESC