Nombre de nouveaux membres inscrit par mois

Résolu/Fermé
Utilisateur anonyme - 21 févr. 2017 à 13:46
 Utilisateur anonyme - 23 févr. 2017 à 16:18
Bonjour, j'ai créer un script pour savoir le nombre de nouveaux membres mais ça ne marche pas comme je voudrais, voici une partie du code :
<?php 
   echo "Les membres inscrit par mois: <br />"; 
   $req = $bdd->prepare("SELECT * FROM membres");
   $req->execute();

    while($info = $req->fetch()){
        $date = date_parse($info['date_inscription']); 
            switch ($date['month']) {
                case 1:
                    $nb = count($date['month']);
                    echo "Le mois de janvier : ".$nb." nouveaux membres <br />"; 
                    break;
                case 2:
                    $nb = count($date['month']);
                    echo "Le mois de février : ".$nb." nouveaux membres <br />"; 
                    break;
                case 3:
                    $nb = count($date['month']);
                    echo "Le mois de mars : ".$nb." nouveaux membres <br />"; 
                    break;
                case 4:
                    $nb = count($date['month']);
                    echo "Le mois de avril : ".$nb." nouveaux membres <br />"; 
                    break;
                case 5:
                    $nb = count($date['month']);
                    echo "Le mois de mai : ".$nb." nouveaux membres <br />"; 
                    break;
                case 6:
                    $nb = count($date['month']);
                    echo "Le mois de juin : ".$nb." nouveaux membres <br />"; 
                    break;
                case 7:
                    $nb = count($date['month']);
                    echo "Le mois de juillet : ".$nb." nouveaux membres <br />"; 
                    break;
                case 8:
                    $nb = count($date['month']);
                    echo "Le mois de aout : ".$nb." nouveaux membres <br />"; 
                    break;
                case 9:
                    $nb = count($date['month']);
                    echo "Le mois de septembre : ".$nb." nouveaux membres <br />"; 
                    break;
                case 10:
                    $nb = count($date['month']);
                    echo "Le mois de octobre : ".$nb." nouveaux membres <br />"; 
                    break;
                case 11:
                    $nb = count($date['month']);
                    echo "Le mois de novembre : ".$nb." nouveaux membres <br />"; 
                    break;
                case 12:
                    $nb = count($date['month']);
                    echo "Le mois de decembre : ".$nb." nouveaux membres <br />"; 
                    break;
                default:
                    echo "erreur <br />";
            } 
    }
?>

ce code me donne ça :
Les membres inscrit par mois:
Le mois de septembre : 1 nouveaux membres
Le mois de janvier : 1 nouveaux membres
Le mois de janvier : 1 nouveaux membres

et je voudrais que par exemple au mois de janvier, ça affiche ça :
Le mois de janvier : 2 nouveaux membres
au lieu d'y mettre sur 2 lignes

Merci d'avance
Nils0
A voir également:

8 réponses

jordane45 Messages postés 38289 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 novembre 2024 4 703
22 févr. 2017 à 16:46
@Reivax :
Il me semble que ça ne marchera pas, car la jointure sera satisfaite s'il y a des inscrits sur le même mois d'une autre année.
Peut-être en déclarant également une sous-requête définissant les années que l'on veut tester (disons de 2015 à 2020...) et en étendant ton mécanisme.


Voici ce que donne ma requête :




Janvier 2016 -> 1 Inscrit
Janvier 2017 -> 1 Inscrit
Février 2017 -> 2 Inscrits
Tous les autres mois (peu importe l'année...) 0 inscrit.

Sinon, plus complet ... (là ça fera tout comme tu veux... :-) )

set @dateDeb = '2015-01-01';
set @datefin = '2020-01-01';
SELECT M.ANNEE
      ,M.MOIS
     , coalesce(D.nombre,0) as NB
FROM
(SELECT YEAR(selected_date) as ANNEE
     , MONTH(selected_date) as MOIS 
FROM 
(select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
 (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
 (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
 (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
WHERE selected_date between @dateDeb and @datefin
GROUP BY ANNEE,MOIS
) M
LEFT JOIN (
		SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
      FROM membres
      GROUP BY YEAR(date_inscription), MONTH(date_inscription)
      ORDER BY YEAR(date_inscription), MONTH(date_inscription)
   )D ON D.mois = M.MOIS AND D.annee = M.ANNEE


          

2
Utilisateur anonyme
22 févr. 2017 à 17:42
Merci beaucoup,
set @dateDeb = '2015-01-01';
set @datefin = '2020-01-01';
c'est a mettre aussi dans la requete sql ?
0
jordane45 Messages postés 38289 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 novembre 2024 4 703 > Utilisateur anonyme
22 févr. 2017 à 17:45
Oui.
Ou sinon tu remplaces directement les cariables dans la requete...(C'est plus simple )
0
Utilisateur anonyme
22 févr. 2017 à 17:51
comme ça ? :
   $req = $bdd->prepare("
set @dateDeb = '2015-01-01';
set @datefin = '2020-01-01';
SELECT M.ANNEE
      ,M.MOIS
     , coalesce(D.nombre,0) as NB
FROM
(SELECT YEAR(selected_date) as ANNEE
     , MONTH(selected_date) as MOIS 
FROM 
(select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
 (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
 (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
 (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
WHERE selected_date between @dateDeb and @datefin
GROUP BY ANNEE,MOIS
) M
LEFT JOIN (
    SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
      FROM membres
      GROUP BY YEAR(date_inscription), MONTH(date_inscription)
      ORDER BY YEAR(date_inscription), MONTH(date_inscription)
   )D ON D.mois = M.MOIS AND D.annee = M.ANNEE
");
   $req->execute();
0
jordane45 Messages postés 38289 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 novembre 2024 4 703 > Utilisateur anonyme
22 févr. 2017 à 19:10
Voici le code complet :



$sql = "SELECT M.ANNEE
              ,M.MOIS
             , coalesce(D.nombre,0) as NB
        FROM
        (SELECT YEAR(selected_date) as ANNEE
             , MONTH(selected_date) as MOIS 
        FROM 
        (select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
         (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
         (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
         (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
         (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
         (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
        WHERE selected_date between :dateDeb and :datefin
        GROUP BY ANNEE,MOIS
        ) M
        LEFT JOIN (
            SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
              FROM membres
              GROUP BY YEAR(date_inscription), MONTH(date_inscription)
              ORDER BY YEAR(date_inscription), MONTH(date_inscription)
           )D ON D.mois = M.MOIS AND D.annee = M.ANNEE";
           

// Période de date pour l'affichage :           
$adatas = array(':dateDeb'=>'2010-01-01',':datefin'=>'2020-01-01');

try{
  $req = $bdd->prepare($sql);
  $req->execute($adatas);
  //on stocke le resultat dans un array...
  $resultat = $req->fetchAll(); 
}catch(Exception $e){
  //En cas de souci dans la requete.
  echo "Erreur ! " .$e->getMessage();
}



//on retravaille l'array pour avoir quelquechose de plus exploitable :
//on boucle sur le resultat de la requete :
$arrfinal = array();
foreach($resultat as $R){
   $A = $R['ANNEE'];
   $M = $R['MOIS'];
   $NB = $R['NB'];  
   $arrfinal[$A][$M]=$NB; 
}

$a_mois = array('janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre');
?>


<html>
  <head>
    <title> TEST </title>
    <meta charset="utf8">
  </head>
  <body>
    <?php
    //on boucle sur l'array retravaillé pour faire l'affichage ...
    
    foreach($arrfinal as $ANNEES=>$MOIS){
      echo "<br><b>Année :$ANNEES</b>";  
      foreach($MOIS as $mois=>$p){
        echo "<br>Le mois de ".$a_mois[$mois-1] ." : $p nouveau". ($p>1 ? "x" : "") . " membre". ($p>1 ? "s" : "");
      }  
    }
    ?>
  </body>
</html>



NB : N'oublie pas, si ce n'est pas déjà fait, d'activer la gestion des erreurs PDO
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

try{
$bdd =new PDO('mysql:host=localhost; 
 dbname=mabdd; charset=utf8', 'user', 'password');
 $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());
}
0
Utilisateur anonyme
22 févr. 2017 à 20:08
super merci beaucoup, je ne sais pas comment te remercier vu le nombre de fois que tu m'as aidé ... :)
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
21 févr. 2017 à 14:22
Salut Nils0,

Utilises les fonctions SQL "COUNT()", "MONTH()" et "YEAR()", et en faisant une requête comme cela :

SELECT COUNT(*) FROM membres WHERE MONTH(date_inscription) = 1  and YEAR(date_inscription) = 2017

Tu aurais directement le résultat fournit par ton SGBD du nombre de personnes inscrites en Janvier 2017.

(sauf erreur, car non testé)


Dal
1
J'ai modifié le code (ça s'améliore mais c'est toujours pas ça...), voici le code:
<?php 

   echo "Les membres inscrit par mois: <br />"; 
   $req = $bdd->prepare("SELECT * FROM membres");
   $req->execute();

   while ($info = $req->fetch()){
    $date = date_parse($info['date_inscription']);
       switch($date['month']){
                case 1:
                    $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 1");
                    $p = $req2->RowCount(); 
                    echo "Le mois de janvier : ".$p." nouveaux membres <br />"; 
                    break;
                case 2:
                    $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 2");
                    $p = $req2->RowCount();
                    echo "Le mois de février : ".$p." nouveaux membres <br />"; 
                    break;
                case 3:
                    $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 3");
                    $p = $req2->RowCount();
                    echo "Le mois de mars : ".$p." nouveaux membres <br />"; 
                    break;
                case 4:
                    $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 4");
                    $p = $req2->RowCount();
                    echo "Le mois de avril : ".$p." nouveaux membres <br />"; 
                    break;
                case 5:
                    $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 5");
                    $p = $req2->RowCount();
                    echo "Le mois de mai : ".$p." nouveaux membres <br />"; 
                    break;
                case 6:
                    $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 6");
                    $p = $req2->RowCount();
                    echo "Le mois de juin : ".$p." nouveaux membres <br />"; 
                    break;
                case 7:
                    $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 7");
                    $p = $req2->RowCount();
                    echo "Le mois de juillet : ".$p." nouveaux membres <br />"; 
                    break;
                case 8:
                    $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 8");
                    $p = $req2->RowCount();
                    echo "Le mois de aout : ".$p." nouveaux membres <br />"; 
                    break;
                case 9:
                    $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 9");
                    $p = $req2->RowCount();
                    echo "Le mois de septembre : ".$p." nouveaux membres <br />"; 
                    break;
                case 10:
                    $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 10");
                    $p = $req2->RowCount();
                    echo "Le mois de octobre : ".$p." nouveaux membres <br />"; 
                    break;
                case 11:
                    $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 11");
                    $p = $req2->RowCount();
                    echo "Le mois de novembre : ".$p." nouveaux membres <br />"; 
                    break;
                case 12:
                    $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 12");
                    $p = $req2->RowCount();
                    echo "Le mois de decembre : ".$p." nouveaux membres <br />"; 
                    break;
                default:
                    echo "erreur <br />";
            }
   }

             

?>

ce qui me donne :
Les membres inscrit par mois:
Le mois de septembre : 1 nouveaux membres
Le mois de janvier : 2 nouveaux membres
Le mois de janvier : 2 nouveaux membres

comment empécher qu'il y est 2 fois la même ligne ?
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
21 févr. 2017 à 14:32
Bonjour,

Comme [Dal], mais avec un GROUP BY tu peux obtenir directement tout ce que tu veux :
SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
FROM membres
GROUP BY YEAR(date_inscription), MONTH(date_inscription)
ORDER BY YEAR(date_inscription), MONTH(date_inscription)


Xavier
1
Utilisateur anonyme
21 févr. 2017 à 14:37
super merci beacoup a vous deux pour votre réponse rapide
je vais voir ce que je peux faire ...
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
21 févr. 2017 à 17:17
Pour préciser ma réponse, voici ce que tu pourrais écrire :
<?php 
   function mois($numero)
   {
      switch ($numero)
      {
         case 1: return "janvier";
         case 2: return "février";
         case 3: return "mars";
         case 4: return "avril";
         case 5: return "mai";
         case 6: return "juin";
         case 7: return "juillet";
         case 8: return "août";
         case 9: return "septembre";
         case 10: return "octobre";
         case 11: return "novembre";
         case 12: return "décembre";
         default: return false;
      }
   }
   echo "Les membres inscrit par mois : <br />"; 
   $req = $bdd->prepare("SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
          FROM membres
          GROUP BY YEAR(date_inscription), MONTH(date_inscription)
          ORDER BY YEAR(date_inscription), MONTH(date_inscription)");
   $req->execute();

   while($info = $req->fetch())
   {
      $date = mois($info['mois']) . ' ' . $info['annee'];
      $nombre = $info['nombre'];
      echo "Le mois de $date : $nombre nouveaux membres. <br />";
   }
?>
0
Utilisateur anonyme
21 févr. 2017 à 18:20
super merci beacoup ça marche comme je veux...
en réalité c'est tous simple :/
0
Utilisateur anonyme
22 févr. 2017 à 14:58
J'ai une dernière question, j'aimerais que ça affiche 0 quand il n'y a de nouveau membre inscrit pendant le mois...
exemple :
Le mois de mars: 0 nouveau membre

Merci d'avance
Nils0
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 févr. 2017 à 15:29
Ah, là ça devient plus compliqué...
Il va falloir faire de la détection de trous au niveau du PHP, je pense que c'est le plus simple.

L'idée c'est, lors de la boucle, de vérifier si ce qu'on s'apprête à écrire correspond bien au mois suivant et, sinon, de remplir par une ligne à 0.

Du coup je propose quelque chose comme ça :

<?php 
   function mois_suivant($mois, $annee)
   {
      $nouvelle_annee = $annee;
      $nouveau_mois = $mois + 1;
      if ($nouveau_mois == 13)
      {
         $nouveau_mois = 1;
         $nouvelle_annee = $annee + 1;
      }
      return array($nouveau_mois, $nouvelle_annee);
   }
   function mois($numero)
   {
      switch ($numero)
      {
         case 1: return "janvier";
         case 2: return "février";
         case 3: return "mars";
         case 4: return "avril";
         case 5: return "mai";
         case 6: return "juin";
         case 7: return "juillet";
         case 8: return "août";
         case 9: return "septembre";
         case 10: return "octobre";
         case 11: return "novembre";
         case 12: return "décembre";
         default: return false;
      }
   }
   function remplir_trous ($mois_debut, $annee_debut, $mois_fin, $annee_fin)
   {
      list($mois, $annee) = mois_suivant($mois_debut, $annee_debut);
      while ($mois != $mois_fin || $annee != $annee_fin)
      {
         ecrire_inscrits($mois, $annee, 0);
         list($mois, $annee) = mois_suivant($mois, $annee);
      }
   }
   function ecrire_inscrits ($mois, $annee, $nombre)
   {
      $date = mois($mois) . ' ' . $annee;
      $nombre = $nombre;
      echo "Le mois de $date : $nombre nouveau(x) membre(s). <br />";
   }

   echo "Les membres inscrits par mois : <br />"; 
   $req = $bdd->prepare("SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
          FROM membres
          GROUP BY YEAR(date_inscription), MONTH(date_inscription)
          ORDER BY YEAR(date_inscription), MONTH(date_inscription)");
   $req->execute();

   $debut = true;
   while($info = $req->fetch())
   {
      if (!$debut) // On ne remplit pas les trous au premier passage...
      {
         remplir_trous($mois_precedent, $annee_precedente, $info['mois'], $info['annee']);
         $debut = false;
      }
      ecrire_inscrits($info['mois'], $info['annee'], $info['nombre']);
      $mois_precedent = $info['mois'];
      $annee_precedente = $info['annee'];
   }
?>


Je crois que c'est bon.
Par contre j'ai codé ça sans filet (je n'ai pas de serveur sous la main... et l'éditeur de CCM n'est pas franchement adapté pour coder en live...). Dis-moi s'il y a un soucis que tu n'arrives pas à résoudre avec ce code.

Xavier
0
jordane45 Messages postés 38289 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 novembre 2024 4 703
Modifié par jordane45 le 22/02/2017 à 15:53
Bonjour,

'aimerais que ça affiche 0 quand il n'y a de nouveau membre inscrit pendant le mois..

Facile...via une requête ...
SELECT M.mois
     , coalesce(D.nombre,0) as NB
     ,D.annee
FROM
(SELECT 1 as mois
UNION SELECT 2 as mois
UNION SELECT 3 as mois
UNION SELECT 4 as mois
UNION SELECT 5 as mois
UNION SELECT 6 as mois
UNION SELECT 7 as mois
UNION SELECT 8 as mois
UNION SELECT 9 as mois
UNION SELECT 10 as mois
UNION SELECT 11 as mois
UNION SELECT 12 as mois
) M
LEFT JOIN (
  SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
      FROM membres
      GROUP BY YEAR(date_inscription), MONTH(date_inscription)
      ORDER BY YEAR(date_inscription), MONTH(date_inscription)
   )D ON D.mois = M.mois


          
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié par Reivax962 le 22/02/2017 à 16:24
Il me semble que ça ne marchera pas, car la jointure sera satisfaite s'il y a des inscrits sur le même mois d'une autre année.
Peut-être en déclarant également une sous-requête définissant les années que l'on veut tester (disons de 2015 à 2020...) et en étendant ton mécanisme.
0
Utilisateur anonyme
22 févr. 2017 à 16:35
Super merci jordane45, c'est exactement ce que je voulais :)
0
Utilisateur anonyme > Utilisateur anonyme
22 févr. 2017 à 16:36
il va juste faloir que je cherche a quoi sert les unions select des les left join
0
Utilisateur anonyme
23 févr. 2017 à 13:09
pourquoi les mois ne sont pas dans l'ordre, j'ai essayé de modifier le ORDER BY mais ça ne change rien...
Je sais je suis chiant ...
0
jordane45 Messages postés 38289 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 novembre 2024 4 703
23 févr. 2017 à 13:12
Tu as repris quel code ?
0
Utilisateur anonyme
22 févr. 2017 à 15:51
ok merci je regarde
0
Utilisateur anonyme
23 févr. 2017 à 14:21
ce code là :

$sql = "SELECT M.ANNEE
              ,M.MOIS
             , coalesce(D.nombre,0) as NB
        FROM
        (SELECT YEAR(selected_date) as ANNEE
             , MONTH(selected_date) as MOIS 
        FROM 
        (select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
         (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
         (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
         (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
         (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
         (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
        WHERE selected_date between :dateDeb and :datefin
        GROUP BY ANNEE,MOIS
        ) M
        LEFT JOIN (
            SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
              FROM membres
              GROUP BY YEAR(date_inscription), MONTH(date_inscription)
              ORDER BY YEAR(date_inscription), MONTH(date_inscription)
           )D ON D.mois = M.MOIS AND D.annee = M.ANNEE";
           

// Période de date pour l'affichage :           
$adatas = array(':dateDeb'=>'2010-01-01',':datefin'=>'2020-01-01');

try{
  $req = $bdd->prepare($sql);
  $req->execute($adatas);
  //on stocke le resultat dans un array...
  $resultat = $req->fetchAll(); 
}catch(Exception $e){
  //En cas de souci dans la requete.
  echo "Erreur ! " .$e->getMessage();
}



//on retravaille l'array pour avoir quelquechose de plus exploitable :
//on boucle sur le resultat de la requete :
$arrfinal = array();
foreach($resultat as $R){
   $A = $R['ANNEE'];
   $M = $R['MOIS'];
   $NB = $R['NB'];  
   $arrfinal[$A][$M]=$NB; 
}

$a_mois = array('janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre');
?>


<html>
  <head>
    <title> TEST </title>
    <meta charset="utf8">
  </head>
  <body>
    <?php
    //on boucle sur l'array retravaillé pour faire l'affichage ...
    
    foreach($arrfinal as $ANNEES=>$MOIS){
      echo "<br><b>Année :$ANNEES</b>";  
      foreach($MOIS as $mois=>$p){
        echo "<br>Le mois de ".$a_mois[$mois-1] ." : $p nouveau". ($p>1 ? "x" : "") . " membre". ($p>1 ? "s" : "");
      }  
    }
    ?>
  </body>
</html>
0
jordane45 Messages postés 38289 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 novembre 2024 4 703
23 févr. 2017 à 14:49
Et si tu fais :

SELECT M.ANNEE
              ,M.MOIS
             , coalesce(D.nombre,0) as NB
        FROM
        (SELECT YEAR(selected_date) as ANNEE
             , MONTH(selected_date) as MOIS 
        FROM 
        (select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
         (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
         (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
         (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
         (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
         (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
        WHERE selected_date between :dateDeb and :datefin
        GROUP BY ANNEE,MOIS
        ) M
        LEFT JOIN (
            SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
              FROM membres
              GROUP BY YEAR(date_inscription), MONTH(date_inscription)
              ORDER BY YEAR(date_inscription), MONTH(date_inscription)
           )D ON D.mois = M.MOIS AND D.annee = M.ANNEE
ORDER BY M.ANNEE,M.MOIS ASC
0
Utilisateur anonyme
23 févr. 2017 à 16:18
Super merci beaucoup, c'est juste parfais :) ;)
0